算法學習筆記:紅黑樹
一、紅黑樹特性
1.節點只能為紅色或者黑色。
2.根節點為黑色。
3.葉節點(NIL)為黑色。
4.紅色節點的子節點必須時黑色節點。
5.任意節點到達該節點的子孫節點的路徑包含相同數目的黑色節點。
二、紅黑樹基本操作
三、插入節點
將紅黑樹作為一棵普通的搜索樹進行插入,將插入節點塗為紅色。之後有三種情況:
1.若當前節點為根節點,將插入節點塗為黑色。
2.若當前節點的父節點為黑色,不需要調整,仍然是紅黑樹。
3.若當前節點的父節點為紅色,將紅色節點移動到根節點後塗黑即可,依然有三種情況:
Case 1:若當前節點的叔叔節點(父節點的兄弟節點)為紅色
①將父節點塗為黑色
②將叔叔節點塗為黑色
③將祖父節點塗為紅色
④將祖父節點設為當前節點繼續進行操作
Case 2:若當前節點的叔叔節點為黑色,且當前節點為其父節點的右子節點
①將父節點設為當前節點
②以當前節點為軸進行左旋
Case 3:若當前節點的叔叔節點為黑色,且當前節點為其父節點的左子節點
①將父節點塗為黑色
②將祖父節點塗為紅色
③以祖父節點為軸進行右旋
四、刪除操作
將紅黑樹作為一棵普通的搜索樹進行刪除。
1.若刪除節點沒有子節點,則直接將其刪除。
2.若刪除節點只有一個子節點,則刪除該節點後其子節點代替其位置。
3.若刪除節點有兩個子節點,交換刪除節點與其後繼節點。重復直到刪除節點滿足①或②,刪除之。
刪除結束後對紅黑樹進行調整
1.若刪除節點為紅色,不需要調整,仍然是紅黑樹。
2.若刪除節點為黑色,那麽我們假設代替刪除節點初始位置的節點繼承了刪除節點的黑色,將這個多余的黑色向樹根移動即可。存在三種情況:
(1)若多余的黑色所在的節點為紅色,則將該節點塗為黑色即可恢復紅黑樹性質。
(2)若多余的黑色所在的節點為黑色,且該節點為根,則不需要調整,仍然是紅黑樹。
(3)若多余的黑色所在的節點為黑色,但該節點不為根,則存在四種情況
Case 1:當前節點的兄弟節點為紅色
①將當前節點的兄弟節點塗為黑色
②將當前節點的父節點塗為紅色
③以當前節點的父節點為軸進行左旋
Case 2:當前節點的兄弟節點為黑色,且兄弟節點的子節點均為黑色
①將當前節點的兄弟節點設為紅色
②將當前節點多余的黑色移動到其父節點
Case 3:當前節點的兄弟節點為黑色,且兄弟節點的左子節點為紅色,右子節點為黑色
①將當前節點的兄弟節點的左子節點塗為黑色
②將當前節點的兄弟節點塗為紅色
③以當前節點的兄弟節點為軸進行右旋
Case 4:當前節點的兄弟節點為黑色,且兄弟節點的右子節點為紅色,左子節點為紅色或黑色
①將當前節點的兄弟節點塗為其父節點的顏色
②將當前節點的父節點塗為黑色
③將當前節點的兄弟節點的右子節點塗為黑色
④以當前節點的父節點為軸進行左旋
⑤將當前節點設置為根節點
算法學習筆記:紅黑樹