【資料結構】二叉樹的基礎知識

love_Aym發表於2018-05-07

一、概述

        在某個階段都是兩種結果的情形,比如開和關、0和1、真和假、上和下、對與錯、正面和反面,都適合用一種很特殊的樹狀結構 建來建模,即為二叉樹。定義如下:



1、二叉樹的特點:Degree≤2


2、二叉樹具有五種基本形態:



二、特殊二叉樹

1、斜樹

  • 左/右斜樹:所有的結點都只有左/右子樹,統稱為斜樹。
  • 特點:每一層都只喲一個結點,結點的個數與二叉樹的深度相同,即Depth=n.
  • 線性表結構可以理解為是樹的一種及其特殊的表現形式。


2、滿二叉樹(完美二叉樹)


注意:單是每個節點都存在左右子樹不蹦不能算滿二叉樹,還必須要所有的葉子都在同一層上,這就做到了整棵樹的平衡。

  • 滿二叉樹的特點:



3、完全二叉樹



注意理解:滿(完美)和完全

滿二叉樹一定是一棵完全二叉樹,但完全二叉樹不一定是滿的。

舉例說明:



完全二叉樹的特點:


判斷完全二叉樹:



三、二叉樹的性質

  • 2^0、2^1、2^2......等比數列:2……i-1
  • 用途:計算每次的結點數



  • 2^0、2^0+2^1、2^0+2^1+2^2、......等比數列求和:(2^k)-1
  • 用途:知道深度求結點數的範圍

  • 終端結點就是葉子結點。

    總結點數:n = n0+n1+n2

    總連線數:n-1=2*n2+1*n1+0*n0   注意:n-1代表根節點沒有進入線。

    聯立上邊兩個式子得到:n0=n2+1

  • 用途:知道度為2的結點數求葉子結點。



深度和總結點數的關係由性質2可得:n=(2^k)-1,則k=log2(n+1)

深度為k-1的總結點數 <= 總結點數 <= 深度為k的總結點數

即(2^(k-1))-1 < n <= (2^k)-1,因為n為整數,這裡可以去掉等號即為2^(k-1) <= n < 2^k

取對數得:k-1<=log2(n)<k

k為整數,因此k的取值範圍為:

  • 用途:知道結點數求深度的範圍



可自行驗證:


  • 用途:知道某個編號,求雙親編號、子樹編號,判斷結點有無兄弟,判斷結點是否為葉結點等。


四、二叉樹的儲存結構

1、順序儲存結構:一般只用於完全二叉樹,因為完全二叉樹具有嚴格的定義



用^來表示不存在的結點。

對於不是完全二叉樹的樹,陣列中會有很多^,造成空間浪費,尤其是右斜樹。


2、二叉連結串列

二叉樹每個結點最多有兩個孩子,所有設計一個資料域和兩個指標域,稱為二叉連結串列。


  • data:資料域
  • lchild:存放左孩子的指標
  • rchild:存放右孩子的指標


如有需要,可以增加一個指向雙親的parent指標域,即成為三叉連結串列。


五、遍歷二叉樹


1、訪問


2、遍歷

3、二叉樹遍歷方法

  • 前序遍歷



  • 中序遍歷



  • 後續遍歷



  • 層序遍歷



4、研究遍歷的意義:



六、線索二叉樹

        對於一個有n個結點的二叉連結串列,每個結點有指向左右孩子的兩個指標域,一共2n個指標域。而n個結點的二叉樹一共n-1條分支線,也就是存在2n-(n-1)=n+1個空指標域。

        為了利用這些空指標域,提出線索二叉樹。

指向前驅和後繼的指標稱為線索,加上線索的二叉鏈稱為線索連結串列,相應的二叉樹稱為線索二叉樹。


中序遍歷:HDIBEAFCG

所有的空指標域中的rchild改為指向它的後繼結點,lchild改為指向它的前驅結點。如下:


線索二叉樹,等於是把一課二叉樹轉變成了一個雙向連結串列,這樣對插入刪除結點、查詢某個結點都帶來了方便。對其遍歷,其實就等於是操作一個雙向連結串列結構。

線索化:對二叉樹以某種次序遍歷使其變為線索二叉樹的過程。


此時遇到一個問題:lchild指向的是它的左孩子還是指向前驅,rchild指向的是它的右孩子還是指向後繼?

因此增設兩個標誌域(boolean):ltag和rtag,只能存放0和1。





七、樹、森林與二叉樹的轉換

1、樹——二叉樹



2、森林——二叉樹



3、二叉樹——樹




4、二叉樹——森林


5、樹與森林的遍歷




八、哈弗曼樹

最基本的壓縮編碼方法——哈弗曼編碼

1、哈弗曼樹

  • 路徑長度:從樹中一個結點到另一個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱作路徑長度。
  • 樹的路徑長度:從樹根到每一結點的路徑長度之和。

a樹的路徑長度為20,b樹的路徑長度為16。


考慮帶權的結點:

  • 結點的帶權的路徑長度:該結點到樹根之間的路徑長度與結點上權的乘積。
  • 樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和。






2、構造哈弗曼樹的步驟:



3、哈夫曼編碼




相關文章