完全二叉樹 陣列儲存 層次構造
阿新 • • 發佈:2018-11-19
對於完全二叉樹,如果將其中的元素按層次遍歷順序存放入一個一維陣列中:
設陣列大小為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 publicint 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即可。