給定乙個陣列a[maxsize],若父結點為a[k] (k != 0),則其左子結點為a[2k],右子結點為a[2k+1],左子結點的左子結點為a[(2^2)*k],左子結點的右子結點為a[(2^2)*k+1],右子結點的左子結點為a[(2^2)*k+2],右子結點的右子結點為a[(2^2)*k+3]......
可以推導出,深度為n的第乙個結點的左子結點(位於n+1層)為a[(2^n)*k],另乙個子結點即右子結點為a[2^n)*k+1]
那麼我們要求出深度為n+1時的任一結點,只要將其陣列下標與深度的關係得出即可列出乙個等式,令返回值==等式值即可,時間複雜度為o(1)
通過上圖我們發現如果完全二叉樹的乙個父結點編號為k,那麼它左兒子的編號就是2*k,右兒子的編號就是2*k+1。如果已知兒子(左兒子或右兒子)的編號是x,那麼它父結點的編號就是x/2,注意這裡只取商的整數部分。在c語言中如果除號『/』兩邊都是整數的話,那麼商也只有整數部分(即自動向下取整),即4/2和5/2都是2。另外如果一棵完全二叉樹有n個結點,那麼這個完全二叉樹的高度為log2 n簡寫為log n,即最多有log n層結點。
publicclass
arrbinarytree
/*順序儲存二叉樹
*//**
* * @description:前序遍歷
* @params:1.陣列下標
* @return
: *
@author
: 蘇興旺
* @time: 2020/3/13 14:25
*/public
void preorder(int
index)
/*輸出當前元素
*/system.out.println(arr[index]);
//左遞迴遍歷
if (index*2+1//右遞迴遍歷
if (index*2+2}
/*中序遍歷
*/public
void infixorder(int
index)
//輸出當前節點
system.out.println(arr[index]);
//右遞迴
if (index*2+2}
/*後序遍歷
*/public
void postorder(int
index)
//右遞迴
if (index*2+2//當前節點
system.out.println(arr[index]);
}
publicclass
arrbinarytreedemo ;
arrbinarytree arrbinarytree = new
arrbinarytree(arr);
/*//前序遍歷
system.out.println("前序遍歷:");
arrbinarytree.preorder(0);
//中序遍歷
system.out.println("中序遍歷:");
arrbinarytree.infixorder(0);
//後序遍歷
system.out.println("後序遍歷:");
arrbinarytree.postorder(0);*/}
}
陣列順序儲存二叉樹
一般先判斷 陣列是否為空,然後再判斷長度是否為0,因為可能報空指標異常。不初始化的時候,預設是null。所以如果在一行 中要同時判斷的時候需要這樣寫 if array null array.length 0 注意 是度短路,如果為空,後面就不判斷了。package com public class ...
順序二叉樹
從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉換,即陣列可 以轉換成樹,樹也可以轉換成陣列。順序二叉樹通常只考慮完全二叉樹 第n個元素的左子節點為 2 n 1 第n個元素的右子節點為 2 n 2 第n個元素的父節點為 n 1 2 n 表示二叉樹中的第幾個元素 按0開始編號如圖所示 相當於陣列的...
陣列二叉樹
要求 現給一串數字,按照順序從根插入到二叉樹中。但是插入的過程要注意,左子樹的值要小於等於父節點,右子樹的值要大於父節點。例如,序列為1 3 4 2 3 0,插入對應的二叉樹為 1 0 3 2 4 3 建好二叉樹後,從根開始輸出每行數字,每層按照從左到右的順序輸出。輸入 第一行為數字序列長度n 1 ...