定義
二叉樹:
二叉樹是一種特殊的樹。二叉樹的特點是每個結點最多有兩個兒子,左邊的叫做左兒子,右邊的叫做右兒子,或者說每個結點最多有兩棵子樹。更加嚴格的遞歸定義是:二叉樹要么為空,要么由根結點、左子樹和右子樹組成,而左子樹和右子樹分別是一棵二叉樹。 下面這棵樹就是一棵二叉樹。

概念圖
樹具有的性質:n 個結點有 n-1 條邊
推論:若樹有 n 個結點,則它有 2n 個指針域,有 n+1 個已使用的指針域,有 n-1 個空指針域
深度(高度):
這里引入深度的概念,我們規定根結點的深度為1,則其子結點的深度為2,子結點的子結點的深度為3......依次類推。

二叉樹的兩種類型
1.滿二叉樹:一顆深度為h且有(2^h)-1個結點的二叉樹

性質:1.若葉子結點有 n 個,則總結點數為 2n-1
2.若結點有 n 個,則樹高為 ⌊log2n⌋ + 1
2.完全二叉樹:設高度為h的一棵樹,除了第h層外,其他第2~(h-1)層都達到最大結點數,第h層從右向左缺失若干個結點,那么這棵樹為完全二叉樹。我們可以認為滿二叉樹為完美的完全二叉樹



完全二叉樹的幾個例子
性質:1.若結點有 n 個,則樹高為 ⌊log2n⌋ + 1
2.若樹高為 h, 則總結點數 n ≤ 2h - 1
3. 若樹的深度為 k ,則第 k 層有 2k-1 個結點
推論:若結點有 n 個,則葉子結點有 ⌊n/2⌋ 個
完全二叉樹最大的優點是可以通過父(子)結點編號求得子(父)結點編號。
數組實現

概念圖
法一:
給定一個數組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層結點。
代碼如下:
for (i = 1; i < (int) pow (2,k) - 1; i++) //數組索引從1開始 cin >> a[i]; //注意最后一個葉子結點之前的空結點也需要標出來,假設上面的概念圖中結點2的右孩子5為空,則數組存儲為 1 2 3 4 空 6,否則會造成結構缺失
