樹結構(二)——二叉搜索樹、平衡二叉樹、紅黑樹、B樹、B+樹

        本篇博客內容略多,涵蓋面比較廣,小編也是正在學習中,故讀者在發現有錯誤的說法,歡迎在評論區指出。此外,樹結構本身就是一個非常複雜的大家庭,各種規則,各種條件,望大家不要氣餒,加油,奧利給。

一、二叉搜索樹

        二叉搜索樹是一種特殊的二叉樹,它的特點是:

  1. 對於任意一個節點p,存儲在p的左子樹的中的所有節點中的值都小於p中的值
  2. 對於任意一個節點p,存儲在p的右子樹的中的所有節點中的值都大於p中的值

        圖例:

        基於二叉搜索樹的特性,採用中序遍歷的方式可以使得遍歷結果是按照從小到大的順序排列的

二、平衡二叉樹

        平衡二叉樹時間複雜度最好的情況下是O(log(n)),但是最壞的情況是O(n),例如:

       針對上述情況,有大牛提出了平衡二叉樹,即AVL樹,所謂平衡是指,對於樹中的每一個位置p,p的孩子的高度最多相差1。

       例如:a的左高度等於3,右高度等於1,差值爲+2,屬於不平衡中的左偏。

       下面,小編會介紹四種不平衡的狀態,並針對這種不平衡狀態給出相應的解決方案:

 

(1)不平衡態(LL):   從上到下都是左邊高 

         解決方案(右旋):這個變換就像是以10爲中心,向右旋轉,使10變成根節點,10的左子樹不變,右子樹變成了20,多餘出的15正好掛在由於變換失去了左子樹的20的左邊。變換後結點從左到右的順序依然沒有變,所以15是正好掛在20的左邊的。

                                                          

(2)不平衡態(RR):   從上到下都是右邊高 

         解決方案(左旋):左旋與右旋的形式差不多,只不顧是反着來的。相當於進行一次左旋轉

       

(3)不平衡態(LR):   從上到下先左高後右高 

         解決方案(左旋後右旋):第一次相當於對5、10、15、17這棵子樹進行了一次左旋,旋轉方式與之前的RR方式相同,就像是以15爲中心向左旋轉,旋轉的結果使得整棵樹變成了LL的不平衡形態,然後再按照LL的右旋方式對整棵樹操作。

     

(4)不平衡態(RL):   從上到下先右高後左高 

         解決方案(右旋後左旋):RL同樣是LR的相反模式,先將22、25、30、40這棵子樹進行LL旋轉,再將整棵樹進行RR旋轉。

       PS:下列特殊情況也是非平衡狀態,因爲左子樹與右子樹的高度相差2。

三、紅黑樹

       本節小編將重點介紹紅黑樹的特性,紅黑樹本身是一個難度係數較大的數據結構,尤其是刪除節點,規則更是複雜,大家如果想深究還是需要下苦功夫的。紅黑樹的應用場景包括,C++中的STL、Java的TreeMap、nginx中用紅黑樹管理timer、epoll在內核中的實現用紅黑樹管理事件塊。講道理小編對紅黑樹的瞭解也是非常膚淺的,但是爲了blog的完整性,還是拋出來一些相關概念。

       紅黑樹有如特性:

  1. 根節點必須爲黑色
  2. 父子不能同爲紅色
  3. 從任何一節點出發,到達葉子節點經過的黑色節點數量一致

       紅黑樹插入時主要觀察插入節點的父節點,祖父節點,及叔叔節點。

       插入規則:默認插入節點爲紅色

(1)插入節點爲根節點: 染黑插入節點

(2)插入節點Parent爲黑: 直接插入

(3)插入節點Parent爲紅: 根據Uncle的情況分類

         1. Uncle是紅色的: 染黑Uncle和Parent,染紅GrandParent

         2. Uncle是黑色的:

                  1. 三角型: 旋轉Parent,執行直線型的操作

                  2. 直線型: 旋轉GrandParent,交換插入節點與GrandParent的顏色

       刪除規則:

(1)刪除節點是葉節點,替換節點爲null

(2)刪除節點有一個子代,替換節點爲該子代

(3)刪除節點有兩個子代,替換節點爲後繼節點(successor)

(4)執行刪除節點,根據刪除節點和替換節點的情況分類討論

         1. 若刪除節點有兩個後代: 交換替換節點與刪除節點鍵值,對替換節點進行刪除操作

         2. 若刪除節點無兩個後代:

                  1. 刪除節點是樹根: 直接刪除或替換

                  2. 刪除節點是葉節點: 若刪除節點是黑色,則爲雙黑,修復雙黑

                  3. 刪除節點有一個後代: 若不是雙黑情況,染黑替換節點

       小編對紅黑樹的插入刪除介紹的較少,讀者如果有興趣可以參考該視頻

四、B樹

       4.1 2-3樹

       在介紹B樹之前,先拋出2-3樹這個概念。2-3樹是一種多路查找樹,2和3的意思是2-3樹包含兩種節點。

(1)2節點包含一個元素兩個孩子(或者沒有孩子),其特點如下:

  1. 左子樹包含節點的元素值小於該節點的元素值,右子樹包含節點的元素值大於該節點的元素值
  2. 2節點要麼有兩個孩子,要麼沒有孩子,不允許有一個孩子

(2)3節點包含一大一小兩個元素(兩個元素按大小排列好)和三個孩子(或者沒有孩子),其特點如下:

  1. 左子樹包含的節點的元素值小於該節點較小的元素值,右子樹包含的節點的元素值大於該節點較大的元素值,中間子樹包含的節點的元素值介於這兩個元素值之間
  2. 3節點要麼有三個孩子,要麼沒有孩子,不允許有一個孩子

(3)2-3樹所有的葉子節點在同一層次

       例如:

 

      4.2 B樹定義        

        B樹也是一種平衡的多路查找樹,2-3樹是B樹的特例,我們把樹中節點最大的孩子數目成爲B樹的階,通常記作m,例如2-3樹的階就是3,因爲最大的孩子數目是3。

        一棵m階B樹特徵如下:

  1. 樹中每個節點至多有m個子樹
  2. 若根節點不是終端節點,則至少有兩棵子樹
  3. 除根節點的所有非葉節點至少有[m/2](該符號是向上取整的意思)棵子樹,即至少有[m/2]-1個關鍵字
  4. 所有葉子節點都出現在同一層次上,不存儲任何信息。
  5. 所有非葉節點結構如下:

      4.3 B樹插入 

        下面我們給定一組關鍵字{20,30,50,52,60,68,70},演示下一棵3階B樹的創建過程。

      4.4 B樹刪除 

        我們根據刪除節點的位置,可以分爲關鍵字在終端節點和不在終端節點上兩種情況。

(1)在終端節點上

        1、刪除節點內關鍵字數量大於[m/2]-1,這時刪除這個關鍵字不會破壞B樹的定義要求,所以直接刪除。

  直接刪除9即可

        2、刪除節點內關鍵字數量等於[m/2]-1,並且其左右兄弟節點中存在關鍵字數量大於[m/2]-1的節點,則去兄弟節點中借關鍵字

        3、刪除節點內關鍵字數量等於[m/2]-1,並且其左右兄弟節點中不存在關鍵字數量大於[m/2]-1的節點,則需要進行節點合併

 

(2)不在終端節點上:先轉換爲終端節點再做處理

        先介紹相鄰關鍵字,對於不在終端節點的關鍵字,它的相鄰關鍵字等於其左子樹中值最大的關鍵字或右子樹中值最小的關鍵字

        1、左右子樹關鍵字數量不都等於[m/2]-1

        2、左右子樹關鍵字數量都等於[m/2]-1,則將兩個左右子樹節點合併,然後刪除待刪除關鍵字

        有關於B樹,讀者可以參閱該視頻

五、B+樹

        B+樹和B樹非常類似,唯一的區別在於B樹的節點中存儲着信息,而B+樹只在葉子節點存儲信息。

        結構上:

  1. B樹中關鍵字集合分佈在整棵樹中,葉節點中不包含任何關鍵字信息,而B+樹關鍵字集合分佈在葉子結點中,非葉節點只是葉子結點中關鍵字的索引
  2. B樹中任何一個關鍵字只出現在一個結點中,而B+樹中的關鍵字必須出現在葉節點中,也可能在非葉結點中重複出現

        性能上(也即爲什麼說B+樹比B樹更適合實際應用中操作系統的文件索引和數據庫索引?)

  1. 不同於B樹只適合隨機檢索,B+樹同時支持隨機檢索和順序檢索
  2. B+樹的磁盤讀寫代價更低。B+樹的內部結點並沒有指向關鍵字具體信息的指針,其內部結點比B樹小,盤塊能容納的結點中關鍵字數量更多,一次性讀入內存中可以查找的關鍵字也就越多,相對的,IO讀寫次數也就降低了。而IO讀寫次數是影響索引檢索效率的最大因素
  3. B+樹的查詢效率更加穩定。B樹搜索有可能會在非葉子結點結束,越靠近根節點的記錄查找時間越短,只要找到關鍵字即可確定記錄的存在,其性能等價於在關鍵字全集內做一次二分查找。而在B+樹中,順序檢索比較明顯,隨機檢索時,任何關鍵字的查找都必須走一條從根節點到葉節點的路,所有關鍵字的查找路徑長度相同,導致每一個關鍵字的查詢效率相當
  4. (數據庫索引採用B+樹的主要原因是,)B-樹在提高了磁盤IO性能的同時並沒有解決元素遍歷的效率低下的問題。B+樹的葉子節點使用指針順序連接在一起,只要遍歷葉子節點就可以實現整棵樹的遍歷。而且在數據庫中基於範圍的查詢是非常頻繁的,而B樹不支持這樣的操作(或者說效率太低)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章