紅黑樹節點的刪除操作比其節點的插入操作要麻煩很多,自己在這個知識點的學習當中也困惑很多,這篇博客是自己在紅黑樹學習當中的一些自我理解與總結。
紅黑樹節點的刪除操作分爲兩大步驟:
(1)找到刪除的節點並且刪除它:因爲在刪除紅黑樹節點時,往往要刪除x,但並不是要刪除X那個節點,而是將紅黑樹的一個適當的節點進行刪除,用這個適當的節點的值去填充要刪除的x這個值。
(2)節點刪除後對紅黑樹的調整,使其滿足紅黑樹的特有條件。
一。找到刪除的節點並且進行刪除
首先要了解,(1)如果刪除的節點是黑色,且其左右節點都爲黑色,要進行節點刪除後的調整(雙黑操作)。(進行調整是因爲要滿足紅黑樹的從某個節點出發其左右子樹中的黑色節點數目相等)
(2)如果刪除的節點爲紅色,則直接刪除,不會對紅黑樹結構造成影響不需要進行調整。
刪除情況分爲3種情況:
在看刪除情況時建議先看看博客後面總結的雙黑操作
(1)刪除點爲葉子節點
(1)刪除點爲紅色,直接刪除
(2)刪除點爲黑色,又因爲在紅黑樹中默認空節點爲黑色的,所以要進行雙黑操作。
例子1
圖22
(2)刪除點只有一個非空子節點
(1)刪除點爲紅色,直接刪除
(2)刪除點爲黑色,其非空子節點爲黑色,直接刪除這個刪除點,並且將其子節點提升到該刪除點
的位置。
(3)刪除點爲黑色,其非空子節點爲紅色,刪除這個刪除點,將其子節點提升到該刪除點的位置,
並且將那個非空子節點改爲黑色。
(3)刪除點右兩個非空子節點
將刪除點的後繼節點和這個刪除點進行替換,然後觀察新的刪除點的位置滿足上面(1)(2)情況的哪種,對其進行操作即可。
由於第三種情況與第一種第二種情況有着千絲萬縷的關係,下面舉的例子比較綜合。
例子1.
例子2.
二、紅黑樹刪除後的調整(雙黑處理)
刪除節點後的調整要根據N的不同情形來分情況處理。假設刪除節點後的樹中,N的父節點爲P,兄弟節點爲S,兄弟節點的左孩子爲SL,兄弟節點的右孩子爲SR。需要注意的是空節點是有顏色的,它是黑色的。
N爲根節點
這種情形非常簡單,直接將其修改爲黑色即可。因爲如果N原來是黑色,則這樣做不會改變其性質,如果原來爲紅色,我們需要保持紅黑樹的性質,也要把它修改爲黑色。N節點爲紅色
空節點不可能是紅色的,而按照我們刪除時所採取的算法,此時的N必定爲被刪除的黑色節點的唯一非空子節點,並且在刪除後它替代了被刪除節點的位置,那麼要恢復紅黑樹的性質就非常簡單,只要將其顏色修改爲黑色即可。(1)(1)N、S、SL、SR、P都爲黑色(刪除節點n的兄弟節點爲黑色,且其兄弟節點的子節點都爲黑)
如下圖所示:調整完後如下圖所示:
(1)(2) N、S、SL、SR都爲黑色,P爲紅色(刪除節點n的兄弟節點爲黑色,且其兄弟節點的子節點都爲黑,但是其父節點爲紅)
如下圖所示:調整完可以得到下圖:
在S和P的顏色互換後,P成爲了黑色,它爲經過節點N的路徑添加了一個黑色節點從而補償了被刪除的黑色節點;同時由於S的兩個孩子都爲黑色,因而S改爲紅色也不會導致兩個連續的紅色節點,由於S的黑色只是上移到了其父節點P上,因而經過S節點的路徑的黑色節點數目也不會發生改變。
(2)(1) N是黑色,S是黑色,SR是紅色(考慮N爲P的左孩子的情形,N爲P的右孩子的情形與之對稱)
(刪除節點n爲黑,其兄弟節點爲黑,但是兄弟節點的兩個子節點有紅色節點,這裏不關心父節點的顏色)
(1)是兄弟節點的子節點中的遠離刪除節點n的那個子節點爲紅色
此種情形如下圖所示:
- 將以P爲根的子樹進行左旋
- 交換P和S的顏色
- 將SR的顏色改爲黑色
- 對原樹中P的父節點來說,調整前後其孩子的顏色沒有改變,而N,P,S,SL,SR在調整之後也沒有出現連續的紅色節點,因而不允許出現連續紅色節點的性質沒有被違背。
- 對於N,P,S,SL,SR這幾個節點組成的樹的部分來說,調整後它們給經由節點N的路徑貢獻的黑色節點數目比調整前增加了一個,這恰好補償了刪除黑色節點的效果;而對於不經過N節點但是又經過其它幾個節點中的任意一個的路徑來說,它們貢獻的黑色節點數目不變。
(2)(2) N是黑色,S是黑色,SL是紅色,SR是黑色(考慮N爲P的左孩子的情形,N爲P的右孩子的情形與之對稱)
(刪除節點n爲黑,其兄弟節點爲黑,但是兄弟節點的兩個子節點有紅色節點,這裏不關心父節點的顏色)
(2)是兄弟節點的子節點中的離刪除節點n比較近的那個子節點爲紅色
此種情形如下圖所示:
此時的做法是:
1.針對s做一次右旋轉,結果使雙黑結點的近侄子成n結點新的兄弟;
2.將新兄弟結點着爲雙黑結點的父結點的顏色,父結點着爲黑色,
3。再針對父做一次左旋轉。
(3) N是黑色,S爲紅色(考慮N爲P的左孩子的情形,N爲P的右孩子的情形與之對稱)
(雙黑節點n的兄弟節點爲紅色【這裏注意只要滿足這一條件,則其父節點和其兄弟節點的左右節點就都爲黑,因爲要滿足紅紅不相連的規則】)
由於S爲紅色,所以P,SL,SR都必定爲黑色,如下圖所示
- 首選對以P爲根節點的子樹進行左旋
- 然後再將S和P的顏色互換,即修改S的顏色爲黑色,P的顏色爲紅色
這就把該情形轉化成了N爲黑色,其兄弟爲黑色的情形,再根據具體的情形參考情形3,4,5,6進行處理即可。