數據結構之2-3-4樹

1. 2-3-4樹是什麼

在二叉樹中,每個節點有一個數據項,最多有兩個子節點。如果允許每個節點可以有更多的數據項和更多的子節點,就是多叉樹(multiway tree)。
2-3-4樹就是一種階爲4的多叉樹,它像紅黑樹一樣是平衡樹,可以保證在O(lgn)的時間內完成查找、插入和刪除操作,容易實現,但是效率比紅黑樹稍差。
下圖展示了一顆2-3-4樹:
在這裏插入圖片描述

它有如下特點:

  • 每個節點可以保存一個、兩個或者三個數據項。
  • 底層的六個節點都是葉節點,所有的葉節點都是在一層上的。
  • 非葉子節點的子節點總數總是比它含有的數據項大1

2-3-4樹中的2、3、4的含義指的是一個節點可能含有的子節點數。對非子葉節點有三種可能的情況:

  • 有一個數據項的節點總是有兩個子節點
  • 有兩個數據項的節點總是有三個子節點
  • 有三個數據項的節點重是有四個子節點

上述的重要的關係決定了2-3-4樹的結構,比較而言,葉節點沒有子節點,然而它可能還有一個、兩個、三個數據項,而空節點是不會存在的。在2-3-4樹中不允許只有一個鏈接。有一個數據項的節點必須總是保持兩個連接,除非它是葉節點,在那種情況下沒有連接。
如下圖所示,有兩個鏈接的節點被稱爲2-節點,有三個鏈接的節點被稱爲3-節點,有四個鏈接的節點被稱爲4-節點,
在這裏插入圖片描述
樹結構中很重要的一點就是它的鏈接與自己數據項的關鍵字之間的關係。二叉樹中,所有關鍵字比某個節點值小的節點都在左子樹中,所有關鍵字比某個值大的節點都在右子樹,2-3-4樹的規則與之類似:
在這裏插入圖片描述

2. 查找

查找特定的關鍵字值的數據項和在二叉樹中的搜索例程很類似。從根開始,除非要查找的關鍵字值就是根,否則選擇關鍵字值所在的合適範圍,轉向那個方向,直到找到爲止。

在這裏插入圖片描述
以上圖爲例查找64。首先從根節點開始,根節點只有一個數據項50,沒有找到,而且因爲64比50大,那麼轉到根節點的右子樹。60|70|80 中也沒有找到,但是60<64<70,所以轉到該節點的第二個子節點:62|64|66,發現其第二個數據項正好是64。

3. 插入

  1. 如果2-3-4樹中已存在當前插入的key,則插入失敗,否則最終一定是在葉子節點中進行插入操作
  2. 如果待插入的節點不是4-節點,那麼直接在該節點插入
  3. 如果待插入的節點是個4-節點,那麼應該先分裂該節點然後再插入。一個4-節點可以分裂成一個根節點和兩個子節點(這三個節點各含一個key)然後在子節點中插入,我們把分裂形成的根節點中的key看成向上層插入的key,然後重複第2步和第3步。

如果是在4-節點中進行插入,每次插入會多出一個分支,如果插入操作導致根節點分裂,則2-3-4樹會生長一層。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

4. 帶預分裂的插入

上面的插入操作在某些情況需要不斷回溯來調整樹的結構以達到平衡。爲了消除回溯過程,在插入操作過程中我們可以採取預分裂的操作,即我們在插入的搜索路徑中,遇到4-節點就分裂(分裂後形成的根節點的key要上移,與父節點中的key合併)這樣可以保證找到需要插入節點時可以直接插入(即該節點一定不是4節點)。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

5. 刪除

  1. 如果2-3-4樹中不存在當前需要刪除的key,則刪除失敗。
  2. 如果當前需要刪除的key不位於葉子節點上,則用後繼key覆蓋,然後在它後繼key所在的子支中刪除該後繼key。
  3. 如果當前需要刪除的key位於葉子節點上:
    3.1 該節點不是2-節點,刪除key,結束
    3.2 該節點是2-節點,刪除該節點:
    3.2.1 如果兄弟節點不是2-節點,則父節點中的key下移到該節點,兄弟節點中的一個key上移
    3.2.2 如果兄弟節點是2-節點,父節點是個3-節點或4-節點,父節點中的key與兄弟節點合併
    3.2.3 如果兄弟節點是2-節點,父節點是個2-節點,父節點中的key與兄弟節點中的key合併,形成一個3-節點,把此節點看成當前節點(此節點實際上是下一層的節點),重複步驟3.2.1到3.2.3

如果是在2節點(葉子節點)中進行刪除,每次刪除會減少一個分支,如果刪除操作導致根節點參與合併,則2-3-4樹會降低一層。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

6. 帶有預合併的刪除

在刪除過程中,我們同樣可以採取預合併的操作,即我們在刪除的搜索路徑中(除根節點,因爲根節點沒有兄弟節點和父節點),遇到當前節點是2節點,如果兄弟節點也是2節點就合併(該節點的父節點中的key下移,與自身和兄弟節點合併);如果兄弟節點不是2節點,則父節點的key下移,兄弟節點中的key上移。這樣可以保證,找到需要刪除的key所在的節點時可以直接刪除(即要刪除的key所在的節點一定不是2節點)。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章