紅黑樹的插入和刪除自平衡基礎知識

2021-10-04 21:55:06 字數 2065 閱讀 2993

背景

參考文件 30張圖帶你徹底理解紅黑樹

過程紅黑樹為空樹。把插入節點作為根節點,並把節點設定為黑色。

插入節點的key已存在。更新當前結點的值為插入節點的值。

插入節點的父節點為黑節點。直接插入。

插入節點的父親節點是紅節點的時候,一共有4種情況。a,叔叔節點存在且為紅色。b,叔叔節點存在是黑色或者不存在。

如果是a情況(插入的時候有兩種插入的情況,但是都一樣處理),不用旋轉,只需要變更父親節點和祖父節點的顏色,並且把祖父節點設定成插入的節點,繼續判斷

如果是b情況,就需要旋轉,為什麼需要旋轉,是因為出現某些子樹的節點多了,因此需要旋轉。

是祖父節點的左子樹。記住標準的乙個,插入節點是父親節點的左子樹。對父親節點和祖父節點進行變色,並右旋祖父節點。

是祖父節點的右子樹。插入節點是父親節點的右子樹,需要先左旋父親節點,變成「標準模式」。然後,對父親節點和祖父節點進行變色,並右旋祖父節點。

有哪些情形?

a) 若刪除節點無子節點,直接刪除。

b) 若刪除節點只有乙個子節點,用子節點替換刪除節點。

c) 若刪除節點有兩個子節點,有後續節點(大於刪除節點的最小節點)替換刪除節點。

對於上述情形c有9種情況:理解前提條件(刪除操作刪除的節點可以看作刪除替代節點,而替代節點最後總是在樹末。)

如果替換節點是紅色的,則不影響樹的平衡,因此在樹的末端找到替代節點,把替代節點的顏色設定為刪除節點的顏色即可。

如果替換節點是黑色的,則一定會影響樹的平衡。

是父親節點的左子節點

兄弟節點是紅節點 (變形到下面的三種情況中的某一種)

兄弟節點是黑節點

a,右子節點是紅節點,左子節點任意顏色(標準模式)

b,右子節點是黑節點,左子節點為紅節點(目標是變成標準模式b--->a)

c,子節點都為黑節點(變成b或者a,如果變成b的話,還需要在變形到a標準模式即可)

是父親節點的右子節點

兄弟節點是紅節點(變形到下面三種情況中的某一種)

兄弟節點是黑節點

a,左子結點是紅結點,右子結點任意顏色(標準模式)

b,左子結點是黑結點,右子結點為紅結點(目標是變成標準模式b--->a)

c,子結點都為黑結點(變成b或者a,如果變成b的話,還需要在變形到a標準模式即可)

小結

插入規律:核心就是,旋轉的時機是什麼?旋轉方向分析過程:如果右旋轉,則左子樹節點多了。如果左旋轉,則右子樹節點多了。無論左旋還是右旋,都是旋轉點,往下拉扯,兒子節點往上拉扯。記住標準模式,有時候需要旋轉父親節點,轉化成標準模式

什麼是標準模式?

這是自定義的。

a) 祖父的左子樹,父親依然是左節點,插入的節點依然是左節點插入。

b) 祖父的右子樹,父親依然是右節點,插入的節點依然是右節點插入。

什麼時候旋轉?

a) 必須把當前節點插入情況,先轉化為標準模式,這個時候,不變色,只是旋轉父親節點即可。旋轉可以理解為拉扯,左旋就是把旋轉點往一邊拉扯。

b) 紅黑樹某個分支的層高或者叫深度比另乙個分支高2了,這個時候需要旋轉。先變父親節點色,再變祖父節點色,把祖父節點當成旋轉點,然後往節點少的乙個分支拉扯即可。

操作:變色 + 拉扯(旋轉)

不用記憶具體的操作細節。而是想,出現某種情況的時候,是變色還是拉扯(旋轉)。

刪除結論。刪除操作可以看成刪除替代節點。先找到刪除節點的替代節點。然後,分析替代節點是什麼顏色即可。如果替代節點是紅色的,不影響紅黑樹平衡,但是顏色會被設定成刪除節點的顏色。

後續通過結合hashmap原始碼對紅黑樹的實踐過程,反過來理解紅黑樹理論知識,會發現,理論知識是一樣的,但是實現的細節或者說是小技巧是不一樣的,理解起來反而更加清晰。

紅黑樹的插入和刪除

上一章講述了紅黑樹得相關性質,我們了解到紅黑樹確實是平衡二叉樹,在時間複雜度為o lg n 比二叉搜尋樹效能更好,效能變好的前提是演算法更加複雜了,下面講述紅黑樹的插入和刪除操作,希望對大家有所幫助。紅黑樹的插入操作和二叉搜尋樹大致相同,不同點是在將節點x插入紅黑樹後,此時的紅黑樹可能會違反紅黑樹的...

關於紅黑樹的插入和刪除

定義 紅黑樹是一棵二叉搜尋樹。它在每個結點每個結點上新增乙個儲存位來表示顏色,可以是紅色或者黑色。通過對任何一條從根到葉子結點的簡單路徑上各個結點的顏色進行約束。紅黑樹保證確保沒有一條路徑會比其他路徑長出兩倍,因而近似是平衡的。性質 1 每個結點或者是紅色或者是黑色 2 根結點是黑色的 3 每個葉子...

理解紅黑樹的節點插入和刪除

每個結點為紅色或者黑色 根結點為黑色 每個葉結點為黑色 如果乙個結點為紅色,則它的兩個子結點為黑色 對每個結點,從該結點到其後代葉子節點的簡單路徑上,均包含相同數目的黑色結點 這裡的葉結點不是指使用者在樹最底層插入的新結點點,而是插入新結點後,新結點的兩個為 nil 的左右孩子 紅黑樹的這 5 個性...