二叉树探究之非叶子结点和叶子结点对半分且最多差一个
分析第一步,二叉樹根據完整性(即最后一層是否滿了)可分為“完整二叉樹”和“非完整二叉樹”(不知道有沒有這個概念,自己定義的),然后從特殊情況開始即“完整二叉樹”開始分析。
設二叉樹共N層,每層都是滿的。那么第一層有1個結點,第二層有1*2個結點,第三層有1*2*2個結點,第N層有2^(N-1)個結點。
一共有1+2+2*2+2^3+2^4+·····+2^(N-1)個結點根據等比數列的求和可以得到結果為(2^N)-1個結點。
由此發現一個神奇的現象,1.完全二叉樹個數是奇數個,因為除了頂端哪一個,地下每層都是成對出現的。
總結點數:S = (2^N)-1,最后一層結點數(葉子結點數):2^(N-1)
所以非葉子結點數為2^N-1-2^(N-1) = 2(N-1)-1? 正好比最后一層結點(葉子結點)少一個
?
那么非完整二叉樹又如何呢?
非完整二叉樹最后一層最少要缺少1個,最多缺少幾個呢,我們知道完整二叉樹最后一層一共有2^(N-1)個結點,假設非完整二叉樹最后一層少了2^(N-1)個結點,那么他就是完整二叉樹,層數是N-1,所以最后一層不能少2^(N-1)個,所以最多缺少2^(N-1)-1個也就是最后一層只剩下一個結點了。
假設非完整二叉樹少了M個結點,那么M>=1并且M<=2^(N-1)-1
那么他的葉子結點和非葉子結點各是多少呢?這里有個誤區,你可能認為葉子節點就是最后一層的結點個數,錯!,第二層右邊的部分結點也可能是葉子結點,只要他地下沒有結點鏈接了就是葉子結點!比如下圖紅色部分都是葉子結點
那么第二層究竟有多少葉子結點呢?
我們知道一個結點下面最多有兩個結點,那么,非完整樹下面缺少M個節點造就了多少個葉子節點呢?
M=1,造就了0個,如下圖
M=2,造就了1個葉子節點,如下圖
依次類推,假設M是偶數,那么創造了M/2個葉子節點,如果M是奇數,那么創造了(M-1)/2個葉子節點。
相對應的非葉子節點就少了M/2個或者少了(M-1)/2個。
假設新轉換的葉子節點個數是T,那么
葉子節點數為原本有的2^(N-1)個少了M個,多了T個,就是2^(N-1)-M+T個,且T = M/2或者T = (M-1)/2
整顆樹的結點有完全數的(2^N)-1個減去少了的M個,就是(2^N)-1-M個
非葉子結點個數就是兩者差即:(2^N)-1-M-[2^(N-1)-M+T]=2^(N-1)-1-T? ? ?
? ? ? 數學不好的看這里:(2^N)-1-M-[2^(N-1)-M+T] 展開括號得到 (2^N)-1-M-2^(N-1)+M-T
? ? ? 然后M消掉得到(2^N)-1-2^(N-1)-T? ?然后2^N可以轉化為2*2^(N-1)? 得到? 2*2^(N-1)-2^(N-1)-1-T
? ? ? 最后得到2^(N-1)-1-T?
葉子結點與非葉子結點的差=2^(N-1)-M+T - [(2^N-1)-1-T] = 2*T-M+1
當M為偶數的時候,T=M/2? ?上述差值為1
當M為奇數時,T = (M-1)/2 上述差值為 0
所以葉子結點和非葉子結點對半分,葉子結點最多多一個
總結
以上是生活随笔為你收集整理的二叉树探究之非叶子结点和叶子结点对半分且最多差一个的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的String为什么是不可变的
- 下一篇: 如何让自己安心学习