1. 程式人生 > >完全二叉樹和滿二叉樹的區別+完全二叉樹求節點問題

完全二叉樹和滿二叉樹的區別+完全二叉樹求節點問題

今天覆習了下二叉樹的相關知識,發現很多都忘掉了,所以在此記錄下

滿二叉樹


如圖,顧名思義,滿二叉樹說白了其實就是除了最後一層,所有節點都有兩個孩子,
所以:
假設現在有一棵深度為N的滿二叉樹:
總結點數就是2^N-1(計算公式:2^0 + 2^1 +…+2^(N-1))
葉子節點數就是2^(N-1)(上圖中葉子節點也就是第三層的節點數位2^2 = 4)

完全二叉樹


如圖,完全二叉樹就是除了最後一排,其餘的都是滿二叉樹,最後一排的節點都連續靠左。
所以:
如果給定了一個完全二叉樹的總結點數,那麼對應應該可以求出他的葉子節點數已經深度。
例如:總結點數位770,求葉子節點

方法一:(詳細步驟)

如下:
2^9 - 1 = 511 < 770
2^10 - 1 = 1023 >770
所以 這個完全二叉樹一共有10層;前9層總結點是511,所以第10層的葉子節點為770 - 511 = 259,
*特別注意*
因為最後一層不是滿的,所以倒數第二層也露出了一些節點,那些節點也算是葉子節點!
第9層總結點數為 2*(9-1) = 256,
第10層一共259個葉子節點,他們的父節點是在第9層的,也就是round(259/2)(向上取整 = 130)這麼多個第9層節點延伸下來的,也就是第9層這些節點是有孩子的,剩下的256 - 130 = 126沒有孩子,也是算葉子節點的。
所以總共 126 + 259 = 385個葉子節點。

方法二(簡便演算法)

如下:
首先了解下定義:
有兩個子節點的節點叫做度數為2的節點,這裡稱作D2
有一個子節點的節點叫做度數為1的節點,這裡稱作D1
有0個子節點的節點叫做度數為0的節點,這裡稱作D0(葉子節點)
於是:
總節點數=D2 + D1 + D0
另外:
D2它會產生兩個新節點,D1產生一個新節點,還有一個根節點本身就存在
所以總結點數 = D2 * 2 + D1 * 1 + 1
聯合兩個方程得到:
D2 + 1 = D0
也就是度數為0的節點數總是比度數為2的節點數多1個
瞭解這一點很重要!!!

好了,下面開始簡單運算過程:
假設總結點數為N,那麼就有:
N = D2 + D1 + D0
又因為之前上面提到 D2 + 1 = D0,所以
N = D0 - 1 + D1 + D0
N = 2D0 + D1 - 1

注意:充分了解完全二叉樹的定義可知,度為1的節點只有可能為0或者1
所以,D1 = 1 OR 0,兩種情況都帶入
D1 = 0時:
N = 2D0 - 1
D0 = (N + 1) / 2
D1 = 1時:
N = 2D0
D0 = N / 2
D0是個整數,所以D0 = N / 2(向上取整)

總結:
葉子節點數 = 總結點數 / 2 (向上取整)