紅黑樹(刪除)

2021-06-16 13:03:14 字數 2564 閱讀 7556

相對於紅黑樹插入操作,刪除操作複雜的多。

第一:先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖:

只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。  黑色節點沒有增多也沒有減少。

注意:以下幾種單支情況在平衡的紅黑樹中不可能出現。

因為上述的情況,紅黑樹處於不平衡狀態。(破壞到null,黑色節點數目相同)

所以,平衡狀態下紅黑樹要麼單支黑-紅,要麼有兩個子節點。

第二:刪除單支黑節點

此種情況被包含在「第三」中,詳見「第三」分析

第三:若刪除節點有左右兩個兒子,即左右子樹,需要按照二叉搜尋樹的刪除規律,從右子樹中找最小的替換刪除節點(該節點至多有乙個右子樹,

無左子樹),我們將該節點記為y, 將刪除節點記為z,將y的右兒子記為x(可能為空)。

刪除規則:用y替換z,交換y與z顏色,同時y = z,改變y的指向,讓y指向最終刪除節點。

為了便於理解,可以先這樣假設:將y與z的資料交換,但顏色不交換,這樣,實際相當於將刪除轉移到了y節點,而z處保持原先狀態(處於平衡)。

此時可以完全不用了理會z節點,直接刪除y節點即可。因為y最多只有乙個右子樹,無左子樹,這便轉移到了「第二」。

對於刪除y節點,有幾種考慮。

1. 若y為紅色,則這種情況如上述」第一「所述,並不影響平衡性。(null視為黑色)

2. 若y為黑色,則刪除y後,x替換了y的位置,這樣x子樹相對於兄弟節點w為根的子樹少了乙個黑節點,影響平衡,需要進行調整。

剩下的調整工作就是將x子樹中找一合適紅色節點,將其置黑,使得x子樹與w子樹達到平衡。

若x為紅色,直接將x置為黑色,即可達到平衡;

若x為黑色,則分下列幾種情況。

情況1:x的兄弟w為紅色,則w的兒子必然全黑,w父親p也為黑。

改變p與w的顏色,同時對p做一次左旋,這樣就將情況1轉變為情況2,3,4的一種。

情況2:x的兄弟w為黑色,x與w的父親顏色可紅可黑。

因為x子樹相對於其兄弟w子樹少乙個黑色節點,可以將w置為紅色,這樣,x子樹與w子樹黑色節點一致,保持了平衡。

new x為x與w的父親。new x相對於它的兄弟節點new w少乙個黑色節點。如果new x為紅色,則將new x置為黑,則整棵樹平衡。否則,

情況2轉換為情況1,3,4  情況2轉變為情況1,2,3,4.

情況3:w為黑色,w左孩子紅色,右孩子黑色。

交換w與左孩子的顏色,對w進行右旋。轉換為情況4

情況4:w為黑色,右孩子為紅色。

交換w與父親p顏色,同時對p做左旋。這樣左邊缺失的黑色就補回來了,同時,將w的右兒子置黑,這樣左右都達到平衡。

個人認為這四種狀況比較難以理解,總結了一下。情況2是最好理解的,減少右子樹的乙個黑色節點,使x與w平衡,將不平衡點上移至x與w的父親。

的情況。情況4:右兒子是紅色節點,那麼將缺失的黑色交給右兒子,通過旋轉,達到平衡。

看一下stl的紅黑樹刪除調整操作 

if (y->color != __rb_tree_red) 

//情況2

if ((w->left == 0 || w->left->color == __rb_tree_black) &&

(w->right == 0 || w->right->color == __rb_tree_black))

else

//情況4

w->color = x_parent->color;

x_parent->color = __rb_tree_black;

if (w->right) w->right->color = __rb_tree_black;

__rb_tree_rotate_left(x_parent, root);

break;}}

if (x) x->color = __rb_tree_black;

}

只擷取了平衡調整部分的**,且省略在右側刪除的情況。

紅黑樹 刪除

分類 演算法筆記 2011 09 07 21 49 318人閱讀收藏 舉報 一 紅黑樹的節點刪除 從紅黑樹上刪除乙個節點,可以先用普通二叉搜尋樹的方法,將節點從紅黑樹上刪除掉,然後再將被破壞的紅黑性質進行恢復。我們回憶一下普通二叉樹的節點刪除方法 z指向需要刪除的節點,y指向實質結構上被刪除的結點,...

紅黑樹刪除

相對於紅黑樹插入 操作,刪除操作複雜的多。第一 先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖 只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。黑色節點沒有增多也沒有減少。注意 以下幾種單支情況在平衡的紅黑樹中不可能出現。因為上述的情況,紅黑樹處於不平衡狀態。破...

紅黑樹的刪除

一 紅黑樹的節點刪除 從紅黑樹上刪除乙個節點,可以先用普通二叉搜尋樹的方法,將節點從紅黑樹上刪除掉,然後再將被破壞的紅黑性質進行恢復。我們回憶一下普通二叉樹的節點刪除方法 z指向需要刪除的節點,y指向實質結構上被刪除的結點,如果z節點只有乙個子節點或沒有子節點,那麼y就是指向z指向的節點。如果z節點...