資料結構與演算法-二叉樹性質

BackSlash發表於2018-12-28
連結串列通常可以提供比陣列更大的靈活性,但是由於連結串列是線性結構,所以很難使用它們來組織物件的分層結構。雖然棧和佇列反映了某些層次,但它們是一維的。為了避免這種限制,我們來探究一種新的資料結構,稱為樹,樹由節點和弧組成。
就像這樣:
資料結構與演算法-二叉樹性質
                                                          圖1-1
與自然界的樹不同,資料結構中的樹是倒過來的:根在頂部,葉子(末端節點)在底部。根是一個沒有父節點只有子節點的節點,而葉節點沒有子節點或者子節點是空結構。一顆樹中非葉子節點我們稱之為非終端節點,包括根節點。
每個節點都可以從根節點經一個唯一的弧序列到達,此弧序列被稱之為路徑,路徑中弧的數量稱之為路徑的長度。節點的層次是從根節點到該節點的路徑的長度加1,也就是該路徑上節點的數量。樹的高度(深度)是樹中節點的最大層次。空結構是空樹,所以空樹高度為0。只有一個根節點的樹的高度是1,而且該樹比較特殊,它是“節點既是根也是葉子”的唯一情況。在一棵樹中,如果某個節點擁有n個子節點,那麼我們稱該節點的度為n。樹在極端情況下可以退化為連結串列,這種樹的高度為唯一葉節點的層次。
就像這樣:
資料結構與演算法-二叉樹性質
                                                          圖1-2
什麼是二叉樹呢?上面說的都是樹的概念,節點下面可以有多個子節點,而二叉樹對此做了限制。二叉樹是節點可以包含最多兩個子節點的樹,每一個子節點都區分左子節點或右子節點。例如圖1-1中13和23節點分別是根節點的左右子節點。我們進一步對二叉樹進行劃分:
  • 完美二叉樹
在一棵二叉樹中,如果每個非終端節點都有兩個子節點,並且所有葉子節點位於同一層次,那麼稱之為完美二叉樹。
就像這樣:
資料結構與演算法-二叉樹性質
                                                   圖1-3
其中非終端節點包括15/13/23,它們都有兩個子節點,並且所有葉子節點都位於第3層。可以看到,完美二叉樹左右子樹是完美對稱的。對於完美二叉樹,有以下特性:
1、第i+1層的節點數為2^i
2、如果完美二叉樹高度為n,那麼總的節點數為2^n - 1
3、如果完美二叉樹中葉子節點為m,非終端節點為k,那麼m=k+1
4、如果完美二叉樹中某節點下標為n,那麼它的左節點下標為2n+1,右節點下標為2n+2
證明:
1、性質1可以用數學歸納法來證明,假設完美二叉樹中第i層節點數為2^(i-1),我們只要推匯出第i+1層節點數為2^i即可。從定義出發,已知第i層的節點都有兩個左右子節點,那麼第i+1層的節點數為(2^(i-1))*2,也就是2^i,證明完畢
2、性質2由性質1衍生出來,對於高度為n的完美二叉樹,節點總數為2^0+2^1+......+2^(n-1),也就是2^n - 1,證明完畢
3、性質3也是由數學歸納法證明的,假設高度為n的完美二叉樹中非終端節點數為k,葉子節點為m,並且m=k+1,只要推匯出高度為n+1的完美二叉樹也符合這種情況即可。假設該樹非終端節點數為k1,葉子節點數為m1,可以計算出k1=k+m,m1=2*m,那麼m1-k1=2*m-(k+m)=m-k=1,即m1=k1+1,證明完畢
4、性質4的證明比較麻煩,假設完美二叉樹第n層存在一個節點下標為i,那麼第n層剩餘節點個數(包括i節點)為(2^n-1)-i,即2^n-i-1,我們記為k,假設i節點左節點下標為j,那麼在第n+1層中j節點之前(不包括j節點)節點數為2^(n+1-1)-2*k=2^n-2*k,我們記為m,那麼j-i=m+k=2^n-2*k+k=2^n-k=2^n-(2^n-i-1)=i+1,即j-i=i+1,那麼j=2i+1,證明完畢
  • 完全二叉樹
對於高度為K的,有n個結點的二叉樹,當且僅當其每一個結點都與高度為K的完美二叉樹中編號從0至n-1的結點一一對應時稱之為完全二叉樹.
  • 完滿二叉樹
在一棵二叉樹中,只存在度為0或者2的節點,稱該樹為完滿二叉樹
我們知道,在二叉樹中只存在度為0或1或2的節點,記為n0,n1,n2,那麼二叉樹中節點總數n可以記為n=n0+n1+n2。在所有二叉樹中存在一個重要的性質:n0=n2+1。該性質可以用數學歸納法證明,假設在一棵二叉樹p中,度為2的節點個數為n2,那麼n0=n2+1,我們只要證明在度為2的節點個數為n2+1的二叉樹q中,該性質不變即可。想象在二叉樹p中,我們為某個葉子節點新增左右節點,那麼該二叉樹變為q,並且度為2的節點個數增加了1,而葉子節點也增加了1,n0依然比n2大1。想象在二叉樹p中,為某個度為1的節點新增一個子節點,那麼該二叉樹變為q,並且度為2的節點個數增加了1,而葉子節點也增加了1,n0依然比n2大1。證明完畢
到目前為止,我們已經瞭解完美二叉樹、完全二叉樹、完滿二叉樹,對於完美二叉樹有4個性質,而完全二叉樹、完滿二叉樹有1個。也許有同學會覺得二叉樹還有其他性質,事實上,其他性質完全可以用以上性質直接或間接推匯出來,性質記得越少越不容易忘記。
二叉樹不是停留在學術上的資料結構,我們是要在程式中實現二叉樹,並且運用它的性質來滿足軟體開發需求。第一步,我們首先要遍歷二叉樹,能夠遍歷才能對節點進行操作。遍歷二叉樹的方法在下一篇進行探討。


相關文章