樹和二叉樹簡介

付威的網路部落格發表於2019-07-20

部落格原文:http://blog.laofu.online/2019/07/12/tree/

樹的定義

為了保證資料的能夠有效的查詢,可以使用順序結構。為了保證資料的插入效率,我們可以使用鏈型結構。但在某些場合,我們需要同時兼顧查詢效率和插入的效率,應該怎麼做?

樹(Tree)型結構是一類常用的高效的非線性的資料結構,兼顧了順序表的查詢效率和連結串列的插入效率。例如我們電腦中的目錄結構,採用的就是一種樹形結構關係。 樹的具體結構形狀如下圖:

關於樹有以下幾個定義:

:每個節點擁有的葉子的個數稱之為度。A節點的度是3 
樹的度:是指節點的最大值,當前樹的度是4。 
根節點:樹的開始節點,A節點是根節點 
葉子節點:沒有子節點的節點,K、L、F節點是葉子節點   

為什麼樹能夠保持較高的查詢和插入效率,對比順序結構, 順序結構的查詢效率的時間複雜度為O(1),插入的效率為O(n),鏈式結構正好相反。

如果我們把資料結構由線形結構轉成樹形結構的話,查詢和遍歷節點的數量一定是小於等於n,所以樹的效率一般是優於線性結構。

樹的儲存形式

  • 雙親表示法

    雙親表示法是指用順序結構來表示數,每個節點設定一個變數,來指示雙親節點所在的位置,如下:

                   

 

  • 孩子表示法

    每個節點可能有多個子節點,可以用使用多級連結串列來分別表示。具體如下 

  • 孩子兄弟表示法

    又稱為二叉樹表示法,是以二叉連結串列的方式進行儲存。表示如下:

             

二叉樹

  二叉樹是一種特殊的樹型結構,有一個根節點和最多有兩個子節點(每個節點的度不大於2)。稱為二叉樹。

 

  • 滿二叉樹:一個深度為k的二叉樹,有2k-1個節點,即除最底層的節點外,其他節點都有兩個葉子節點。

  • 完全二叉樹 除了葉子節點不滿,其他都滿。且最下面一層節點如果不滿,則所有的節點在左邊的連續排列,空位都在右邊。這樣的二叉樹就是一棵完全二叉樹。滿二叉樹是特殊的完全二叉樹。

     

  • 二叉查詢樹: 又名二叉搜尋樹,二叉排序樹,即在插入的時候,值的大小就決定了在二叉樹中的位置。

    具有以下性質:

    1. 若任意節點的左子樹不空,則左子樹上所有結點的值小於它的根結點的值;

    2. 若任意節點的右子樹不空,則右子樹上所有結點的值大於它的根結點的值;

    3. 任意節點的左、右子樹也分別為二叉查詢樹;

    4. 沒有鍵值相等的節點。

    如下圖

        

  • 平衡二叉樹:前面我們看到了二叉查詢樹的特點,如果當根節點選擇不當的時候,會出現左右失衡的現象,比如:

如果我們查詢的資料是160的話,需要遍歷深度為6。如果我們在插入的時候能讓樹保持在一個合理的深度,每次插入進行平衡,這樣檢索的效率會不會提升?這就是我們要引入的平衡二叉樹,明確定義是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹,我們把上圖進行整理成平衡二叉樹。結果如下:   

 

 

     這樣在查詢160的時候,只需要遍歷深度為3. 但平衡二叉樹在插入資料的會造成失衡,所以平衡二叉樹修改時候比二叉搜尋樹更加複雜。

 

  • 紅黑樹:紅黑樹是帶有紅黑標記的二叉查詢樹,除了排序的屬性有多了顏色的屬性

 

紅黑樹除了具有查詢的樹的特點外,還具有具有以下特點:

    1. 根節點一定是黑色的,節點非黑即紅
    2. 每個紅節點的兩個子節點都是黑色的、
    3. 任意節點到每個葉子節點的所有路徑都包含相同的黑色節點
    4. 葉子節點都是黑色(Null)節點

如果我們將一個資料185插入到上面的樹的節點中,過程如下:

 

 

  •  霍夫曼樹: 是一種帶有權重的最優二叉樹。 首先看一個例子:

上面有三顆樹,我們把葉子節點到根節點的權重和深度乘積的和稱為權重路徑長度 (WPL) 則上面三顆樹的長度分別為:

    1. WPL= 72+52+22+42=36
    2. WPL= 73+53+21+42=46
    3. WPL= 71+52+23+43=35

從上面的結果可以看出第3棵為最小,也可以證明第3棵是最優二叉樹, 所以霍夫曼樹的特點就權重最大的節點路徑為最短,這樣能使整顆樹的權重路徑長度最小。

霍夫曼樹常用的字串的縮減,稱為霍夫曼編碼,能夠有效的降低編碼的長度。

 

相關文章