1. 程式人生 > >【樹2】二叉樹

【樹2】二叉樹

填充 通過 nbsp 速度 消元 理解 .com 我們 rdquo

二叉樹簡介

---------------------------註:本文所用的術語定義均來自國外大學和計算機文獻使用的定義,非國內教材。------------------------------

二叉樹也是一種樹,它特殊在: 1、每個結點的孩子最多只能是2,即二叉樹中不存在度大於2的結點。 2、每個結點的孩子結點區分左孩子和又孩子,即便是只有1個孩子結點,也分左孩子和右孩子。 註意: 1、二叉樹是 rooted tree。即二叉樹必須指定,且固定有一個唯一的root結點。這話聽起來很奇怪:只要樹不為空,肯定有root結點啊?可是,一般情況下的樹,他的每一個結點都可以當做root去看待,只不過我們腦袋裏總把一棵樹的圖形固定去理解而已。但是二叉樹的root結點必須是固定唯一,明確指出的。 2、二叉樹是有序樹(ordered tree)。這點對於啃過國內大學教材的朋友來說就很有爭議。我的理解是:二叉樹中的孩子是區分左右的,左右不應該和次序混為一談,只不過二叉樹在實現時,都是通過按有序的方式去完成的。

二叉樹的性質

1、二叉樹的許多性質都和2有關,確切的說是以2為公比,首項為1的等比數列有關。

2、二叉樹的第i層上的節點數最多為 2i-1 個 (i>=1) (數列的第i項
3、k層的二叉樹至多有2k - 1個結點(k≥1)。    (當每層都達到做多結點時,達到最大值 。數列的前k項和 4、在任意一棵二叉樹中,若終端(葉子)結點的個數為n0,度為2的結點數為n2,則有:n0=n2+1。 要證明這個性質,就要從點和線的方面去分析。 設:度為2的結點個數有n2個,度為1的結點有n1個,度為0 的葉子結點有n0個,樹的總結點為V個。 樹的總的 邊 的個數為E。 ① V = n2 + n1 + n0 ② E= V - 1 除了root結點,其他結點都是由頭頂上的一條邊引出來的。 ③ E= 2*n2 + n1
度為2的結點,必頂會向下引出2條邊, 同理,度為1的結點會引出1條。 結合3個式子消元得:n0 = n2 + 1 5、一個有n個結點的二叉樹,其層次數L 滿足不等式 技術分享

很好理解。當這個二叉樹是完全二叉樹時,其層次數最小,當每一層僅有1個結點時,層次數最大。


一般二叉樹的存儲實現

1、使用數組作為內部存儲。 這種存儲方法只適合完全二叉樹,如果是一般二叉樹,會造成空間浪費。首先我們需要了解一下當對完全二叉樹使用順序存儲時的細節。 給完全二叉樹的結點,從上到下,從左到右依次從0開始編號作為這個結點的索引,且索引為i的結點,存儲在數組下標為i的地方。則: 如果i==0,則它是root結點。 如果i >0 ,則他的父結點的索引為:技術分享
如果 2*(i+1) > n ,則它無左孩子。 2*(i+1) <=n , 則他的左孩子的索引為 2i +1 如果 2*(i+1)+1 > n,則他無右孩子。 2*(i+1)+1 <= n,則它的右孩子的索引為 2i+2 可以發現,使用數組存儲完全二叉樹是非常高效的,因為結點之間的關系都暗含在索引之中了,無需額外的指針,且數組的隨機訪問速度也很快。 如過一個一般二叉樹要使用這種方法存儲,先要填補為一個完全二叉樹。 技術分享

上圖可以看出,填充浪費一大半的數組空間,所以,一般二叉樹不會使用這種存儲策略。 2、鏈式存儲結構:適合用於存儲一般形態的二叉樹。鏈式存儲更加通用。但是如果是完全二叉樹,使用順序存儲更佳。缺點是指針域占用的空間較多。
題目:采用這種設計時,若總結點數為N,則會有多少個空指針域? 答:N+2個。 因為N個結點的樹,會有N-1個邊,3N個指針域,而每一條邊會“消滅”2個空指針域。則空指針域 = 3N-2(N-1) = N+2 技術分享

有時候我們無需知道一個結點的父結點,則結點的設計可以去掉parent域。

題目:采用這種設計時,若總結點數為N,則會有多少個空指針域?答:N+1

因為N個結點的樹,會有N-1個邊,2N個指針域,而每一條邊會“消滅”1個空指針域。則空指針域 = 2N-(N-1) = N+1

技術分享

【樹2】二叉樹