順序存儲二叉樹的概念]
基本說明
從數據存儲來看,數組存儲方式和樹
的存儲方式可以相互轉換,即數組可
以轉換成樹,樹也可以轉換成數組,
看右面的示意圖。要求:
下的二叉樹的結點,要求以數組的方式來存放 arr : [1, 2, 3, 4, 5, 6, 6]
要求在遍歷數組 arr時,仍然可以以前序遍歷,中序遍歷和后序遍歷的方式完成結點的遍歷
示意圖
順序存儲二叉樹的特點:
順序二叉樹通常只考慮完全二叉樹
第n個元素的左子節點為 2 * n + 1
第n個元素的右子節點為 2 * n + 2
第n個元素的父節點為 (n-1) / 2n : 表示二叉樹中的第幾個元素(按0開始編號?如圖所示)
需求: 給你一個數組 {1,2,3,4,5,6,7},要求以二叉樹前序遍歷的方式進行遍歷。 前序遍歷的結果應當為 1,2,4,5,3,6,7
代碼實現
package cn.icanci.datastructure.tree;
import sun.text.normalizer.UBiDiProps;
import java.lang.reflect.Array;
/**
* @Author: icanci
* @ProjectName: AlgorithmAndDataStructure
* @PackageName: cn.icanci.datastructure.tree
* @Date: Created in 2020/3/11 13:24
* @ClassAction: 順序存儲二叉樹
*/
public class ArrayTree {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
arrayBinaryTree.preOrder();
}
}
class ArrayBinaryTree {
//存儲數據
private int[] arr;
public ArrayBinaryTree(int[] arr) {
this.arr = arr;
}
public void preOrder() {
this.preOrder(0);
}
/**
* 編寫一個方法 用來順序存儲而擦函數的遍歷
*
* @param index 數組下標
*/
public void preOrder(int index) {
if (arr == null || arr.length == 0) {
System.out.println("數組不能為空 不可遍歷");
return;
}
// 輸出當前得元素
System.out.print(arr[index] + " ");
//向左邊遞歸
if ((2 * index + 1) < arr.length) {
preOrder(2 * index + 1);
}
//向右邊遞歸
if ((2 * index + 2) < arr.length) {
preOrder(2 * index + 2);
}
}
}
測試
1 2 4 8 9 5 10 3 6 7
順序存儲二叉樹應用實例
八大排序算法中的堆排序,就會使用到順序存儲二叉樹, 關于堆排序,我們放在<<樹結構實際應用>> 章節講解。