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

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

如需轉載,請註明出處   http://www.cnblogs.com/nullzx/ 數據結構

相關博客:spa

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

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

1. 2-3-4樹的定義

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

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

(2)全部葉子節點到根節點的長度一致(也就是說葉子節點都在同一層)。博客

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

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

相關文章
相關標籤/搜索