1. 程式人生 > >完全二叉樹 陣列儲存 層次構造

完全二叉樹 陣列儲存 層次構造

對於完全二叉樹,如果將其中的元素按層次遍歷順序存放入一個一維陣列中:
設陣列大小為n(節點數為n),節點標號(key)為陣列下標i,即0,1,2,3,4,,,
那麼:
1.完全二叉樹的高度為: ceil(log2(n+1))
2.i = 0: 根節點,root,無父節點。
i >= 1: 父節點為 floor((i-1)/2);
3.若2*i<n-1: 節點i的左子女為 2*i + 1
若2*i<n-2: 節點i的右子女為 2*i + 2
4.若節點編號 i 為奇數,i != 1, 它處於右兄弟位置,則它的左兄弟為節點 i-1
5.若節點編號 i 為偶數,i != 1, 它處於左兄弟位置,則它的右兄弟為節點 i+1
6.節點i所在的層次為 floor(log2(i-1))+1;

Java實現:
 1  
 2 /**
 3  * Created by XuTao on 2018/11/18 11:54
 4  * 完全二叉樹:
 5  * 用陣列按層次序排列
 6  *
 7  */
 8 
 9  
10 public class BT {
11     private Node root;
12     private int [] data;
13     public BT_ArrayStore(int []a){
14         this.data =a;
15         this.root = create(a,0);
16     }
17 
18     public
int getHeight(){ 19 return (int)Math.floor(Math.log(data.length)/Math.log(2))+1; //這裡涉及到Math,易錯 20 } 21 public int getFather(int i){ 22 if (i==0) return 0; 23 return (int)(Math.floor((i-1)/2)); 24 } 25 26 public int getLeft(int i){ 27 return 2*i+1; 28 }
29 public int getRight(int i){ 30 return 2*i+2; 31 } 32 33 public int getBrother(int i){ 34 if (i%2==0) 35 return i-1; 36 else return i+1; 37 } 38 public int getLevel(int i){ 39 return (int)(Math.floor(Math.log(i-1)/Math.log(2)))+1; 40 } 41 42 43 private Node create(int[] arr, int index) { 44 if (index >= arr.length) // 可以不需要,但是所有的值必須要寫滿,任一個#都要寫,不然會越界 45 return null; 46 else if (String.valueOf(arr[index]).equals("#")||String.valueOf(arr[index]).equals("*")) { 47 return null; 48 } else { 49 Node node = new Node(arr[index]); 50 node.left = create(arr, 2 * index + 1); 51 node.right = create(arr, 2 * index + 2); 52 return node; 53 } 54 } 55 56 class Node{ 57 private Node left; 58 private Node right; 59 private int data; 60 public Node(int data){ 61 this.data = data; 62 } 63 } 64 65 public static void main(String[] args) { 66 int []a = new int[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; 67 BT bt = new BT (a); 68 System.out.println(bt.getHeight()); 69 System.out.println(bt.getFather(14)); 70 System.out.println(bt.getLeft(4)); 71 System.out.println(bt.getRight(5)); 72 System.out.println(bt.getBrother(5)); 73 System.out.println(bt.getLevel(5)); 74 75 } 76 }

如果是1---n, 那麼上述公式每個i加1即可。