從2-3-4樹到紅黑樹(上)


歡迎探討,如有錯誤敬請指正

如需轉載,請注明出處   http://www.cnblogs.com/nullzx/

相關博客:

從2-3-4樹到紅黑樹(中)

從2-3-4樹到紅黑樹(下)

1. 2-3-4樹的定義

2-3-4樹是一種階為4的B樹。它是一種自平衡的數據結構,可以保證在O(lgn)的時間內完成查找、插入和刪除操作。它主要滿足以下性質:

(1)每個節點每個節點有1、2或3個key,分別稱為2(孩子)節點,3(孩子)節點,4(孩子)節點。

(2)所有葉子節點到根節點的長度一致(也就是說葉子節點都在同一層)。

(3)每個節點的key從左到右保持了從小到大的順序,兩個key之間的子樹中所有的

key一定大於它的父節點的左key,小於父節點的右key。

image

2. 插入操作

(1)如果2-3-4樹中已存在當前插入的key,則插入失敗,否則最終一定是在葉子節點中進行插入操作

(2)如果待插入的節點不是4節點,那么直接在該節點插入

(3)如果待插入的節點是個4節點,那么應該先分裂該節點然后再插入。一個4節點可以分裂成一個根節點和兩個子節點(這三個節點各含一個key)然后在子節點中插入,我們把分裂形成的根節點中的key看成向上層插入的key,然后重復第2步和第3步。

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

image


image


image


image


image

3. 刪除操作

(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樹會降低一層。

image


image

image


image


image

4. 帶有預分裂的插入操作

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

image


 

image


image


image


image


image

5. 帶有預合並的刪除操作

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

image


image

這里包含key為60的節點也可以選擇讓父節點中的key 76下移和兄弟節點中的83合並,兩種方式都能達到B樹的平衡,這也是在2-3-4樹對應的紅黑樹中使用的方式。


image


image


image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM