紅黑樹節點的刪除操作

    紅黑樹節點的刪除操作比其節點的插入操作要麻煩很多,自己在這個知識點的學習當中也困惑很多,這篇博客是自己在紅黑樹學習當中的一些自我理解與總結。

紅黑樹節點的刪除操作分爲兩大步驟:

(1)找到刪除的節點並且刪除它:因爲在刪除紅黑樹節點時,往往要刪除x,但並不是要刪除X那個節點,而是將紅黑樹的一個適當的節點進行刪除,用這個適當的節點的值去填充要刪除的x這個值。

(2)節點刪除後對紅黑樹的調整,使其滿足紅黑樹的特有條件。

一。找到刪除的節點並且進行刪除

        首先要了解,(1)如果刪除的節點是黑色,且其左右節點都爲黑色,要進行節點刪除後的調整(雙黑操作)。(進行調整是因爲要滿足紅黑樹的從某個節點出發其左右子樹中的黑色節點數目相等)

                           (2)如果刪除的節點爲紅色,則直接刪除,不會對紅黑樹結構造成影響不需要進行調整。

 刪除情況分爲3種情況:

在看刪除情況時建議先看看博客後面總結的雙黑操作

       (1)刪除點爲葉子節點

                 (1)刪除點爲紅色,直接刪除


紅黑樹刪除操作 - 楓葉 - 楓葉


                刪除結點0,結點0爲紅色結點,直接刪除即可                

             (2)刪除點爲黑色,又因爲在紅黑樹中默認空節點爲黑色的,所以要進行雙黑操作。

                           例子1

紅黑樹刪除操作 - 楓葉 - 楓葉

 圖21
                     刪除結點18,結點18爲葉子結點,且爲黑色,刪除後出現雙黑,屬於雙黑處理的第一種情況的(2),處理後

紅黑樹刪除操作 - 楓葉 - 楓葉

圖22



 
                                         例子2

  

紅黑樹刪除操作 - 楓葉 - 楓葉


 


                
               刪除結點15,結點15爲葉子結點,且爲黑色,刪除後出現“雙黑”,進行雙黑操作。屬於後面介紹的雙黑處理的第二種情況的第(2)個,得到

紅黑樹刪除操作 - 楓葉 - 楓葉


       (2)刪除點只有一個非空子節點

                 (1)刪除點爲紅色,直接刪除


                 (2)刪除點爲黑色,其非空子節點爲黑色,直接刪除這個刪除點,並且將其子節點提升到該刪除點

                            的位置。

                 (3)刪除點爲黑色,其非空子節點爲紅色,刪除這個刪除點,將其子節點提升到該刪除點的位置,

                           並且將那個非空子節點改爲黑色。

紅黑樹刪除操作 - 楓葉 - 楓葉


               刪除結點11,結點11有一個非空子結點,爲第二種情況的(3)情況,刪除11 後,將其非空子結點着爲黑色
 

紅黑樹刪除操作 - 楓葉 - 楓葉


       (3)刪除點右兩個非空子節點                

                    將刪除點的後繼節點和這個刪除點進行替換,然後觀察新的刪除點的位置滿足上面(1)(2)情況的哪種,對其進行操作即可。

由於第三種情況與第一種第二種情況有着千絲萬縷的關係,下面舉的例子比較綜合。

                        例子1.

紅黑樹刪除操作 - 楓葉 - 楓葉
            刪除1結點,1結點有兩個非空子結點,調整爲葉子結點,與其後繼結點2進行值 交換;此時,1結點只有一個非空子結點,則刪除1結點後,將其子結點着爲黑色,處理結果如圖13
紅黑樹刪除操作 - 楓葉 - 楓葉

                   例子2.

紅黑樹刪除操作 - 楓葉 - 楓葉

        刪除結2,結點2有兩個非空子結點,與後繼結點3值交換;後繼結點爲黑色,刪除2後,出現雙黑;用第一種方法的(2)情況來解決


         結果爲:

紅黑樹刪除操作 - 楓葉 - 楓葉

            



二、紅黑樹刪除後的調整(雙黑處理)

刪除節點後的調整要根據N的不同情形來分情況處理。假設刪除節點後的樹中,N的父節點爲P,兄弟節點爲S,兄弟節點的左孩子爲SL,兄弟節點的右孩子爲SR。需要注意的是空節點是有顏色的,它是黑色的。

 N爲根節點

這種情形非常簡單,直接將其修改爲黑色即可。因爲如果N原來是黑色,則這樣做不會改變其性質,如果原來爲紅色,我們需要保持紅黑樹的性質,也要把它修改爲黑色。

 N節點爲紅色

空節點不可能是紅色的,而按照我們刪除時所採取的算法,此時的N必定爲被刪除的黑色節點的唯一非空子節點,並且在刪除後它替代了被刪除節點的位置,那麼要恢復紅黑樹的性質就非常簡單,只要將其顏色修改爲黑色即可。

(1)(1)N、S、SL、SR、P都爲黑色(刪除節點n的兄弟節點爲黑色,且其兄弟節點的子節點都爲黑)

如下圖所示:

此時的做法是將S的顏色修改爲紅色,則通過S和通過P的路徑上的黑色節點數目變得相同了,但是通過N的路徑比不通過N的路徑都少了一個黑色節點,因而需要將P節點看做N節點重新執行調整算法。

調整完後如下圖所示:

(1)(2) N、S、SL、SR都爲黑色,P爲紅色(刪除節點n的兄弟節點爲黑色,且其兄弟節點的子節點都爲黑,但是其父節點爲紅)

如下圖所示:
此時的處理很簡單,只需要將S和P的顏色互換即可完成調整

調整完可以得到下圖:

在S和P的顏色互換後,P成爲了黑色,它爲經過節點N的路徑添加了一個黑色節點從而補償了被刪除的黑色節點;同時由於S的兩個孩子都爲黑色,因而S改爲紅色也不會導致兩個連續的紅色節點,由於S的黑色只是上移到了其父節點P上,因而經過S節點的路徑的黑色節點數目也不會發生改變。

(2)(1) N是黑色,S是黑色,SR是紅色(考慮N爲P的左孩子的情形,N爲P的右孩子的情形與之對稱)

        (刪除節點n爲黑,其兄弟節點爲黑,但是兄弟節點的兩個子節點有紅色節點,這裏不關心父節點的顏色)

                       (1)是兄弟節點的子節點中的遠離刪除節點n的那個子節點爲紅色

此種情形如下圖所示:



此時的做法:
  1. 將以P爲根的子樹進行左旋
  2. 交換P和S的顏色
  3. 將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。再針對父做一次左旋轉

則進行1.2不操作後可以得到下圖:
由於節點SL的左孩子在旋轉前後不變,而SL原來爲紅色,所以SL的左節點必然爲黑色,因而旋轉後,對於N節點來說,這就是情形5,按照情形5進行處理即可。因此總體上來說這種情形需要一次左旋,一次右旋。這裏第三步操作沒有畫出來

(3) N是黑色,S爲紅色(考慮N爲P的左孩子的情形,N爲P的右孩子的情形與之對稱)

                 (雙黑節點n的兄弟節點爲紅色【這裏注意只要滿足這一條件,則其父節點和其兄弟節點的左右節點就都爲黑,因爲要滿足紅紅不相連的規則】)

由於S爲紅色,所以P,SL,SR都必定爲黑色,如下圖所示


此時的做法是:
  1. 首選對以P爲根節點的子樹進行左旋
  2. 然後再將S和P的顏色互換,即修改S的顏色爲黑色,P的顏色爲紅色
則可以得到下圖:

這就把該情形轉化成了N爲黑色,其兄弟爲黑色的情形,再根據具體的情形參考情形3,4,5,6進行處理即可。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章