紅黑樹的刪除—10張圖學會

如果要學紅黑樹,那麼就必須知道二叉樹,畢竟紅黑樹本身就是一個二叉搜索樹。只不過紅黑樹比一般的二叉搜索樹更加穩定,也就是更加平衡,但是有沒有AVL樹那麼的穩定,這換來的是紅黑樹比AVL數有更好的插入和刪除效率,但是查找效率並沒有比AVL差很多。下文我將用RBT代替紅黑樹。

二叉搜索樹的刪除

介紹RBT的刪除,就先要知道二叉搜索樹的刪除(知道的同學可以直接跳過)。

刪除分爲四步:
1.找到刪除點假設爲X
2.找到X的代替點D,這裏代替點可以有兩個:一個是X左子樹的最大點,也就是X左子樹的最右點(也就是前驅點);另外一種就是X的右子樹的最小點,也就是X的右子樹的最左變點(也就是後繼點)。
3.將X的值改成爲代替點D。
4.如果代替點有子節點,那麼,刪除代替點,並用其子節點接上這個缺口;如果無子節點,則直接刪除。

這裏寫圖片描述

這裏我們要刪除15,那麼代替點可以爲16(後繼)或者14(前驅)。接着我們將15的值改爲代替點的值,然後刪除原代替點,並用其子節點補上。好了,二叉搜索樹的刪除就結束了,是不是特別簡單?

PS:18和19畫反了。


RBT的刪除概述

先來看看RBT的定義:
(1)每個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每個葉子節點(NIL)是黑色。 [這裏葉子節點,是指爲空NIL的葉子節點!]
(4)如果一個節點是紅色的,則它的子節點必須是黑色的。
(5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。

比較重要的是4.5,BRT所做的操作很多都是爲了滿足4.5條屬性。因此一定要記住!

RBT的刪除分爲兩個步驟:
1.刪除節點,也就是最簡單的二叉搜索樹的刪除操作,只不過除了使用代替的值D替換被刪除點的值X以外,還要保證原X點的顏色不變。
2.調整節點顏色,使得滿足RBT的5個屬性(主要是4,5)。

假設我們使用了後繼的方法完第一步刪除節點的操作。並且用D表示要刪除的代替點,P表示D的Parent,S表示D的Sister,SL、SR表示LeftTree和RigthTree,DR表示D的DR。


RBT的刪除Case討論

Case1:D爲紅色,此時DR肯定是NIL。(別問爲什麼,去看性質4.5)

因爲D爲紅色,那麼刪除以後不影響左邊路徑黑節點的個數,此時直接用DR補上。

這裏寫圖片描述

圖上的DR我寫錯了,哈哈,左右不分。


Case2-1:代替D爲黑色,且DR不爲空,則DR必爲紅色(別問爲什麼,去看性質4.5)。

直接使用DR去補缺口並且改變顏色即可。
爲啥?
大哥,你D是黑色的如果刪除了那麼就少了一個黑點了,如果DR顏色不變成黑色你還想平衡?

這裏寫圖片描述


Case2-2 代替D爲黑色,且DR爲空,也就是爲NIL,是黑色的(爲啥?看性質4,5)。

分析:如果刪除了D,那麼P的左邊黑點必定少一個,但是左邊沒有能補得了。此時就需要藉助D的兄妹節點S來幫忙了。

這裏寫圖片描述


Case2-2-1:DR爲空,也就是爲NIL,是黑色的。
若:DR兄妹節S點爲紅色,那麼P肯定是黑色。

PS:這種情況SL或SR肯定不爲NIL,想想爲什麼?
答:P爲黑色,D爲黑色,DR爲黑色,那麼P左邊路徑黑點是3;S爲紅色,SL爲黑色,此時SL如果爲NIL那麼P右路徑的黑點只有2了,這就說明刪除操作前此樹就不是RBT了。

這種情況,左邊要可以向右邊借一個黑點S來補一補

這裏寫圖片描述


Case2-2-2:DR爲空,也就是爲NIL,是黑色的。若:兄妹節點爲黑色, 那麼P不能確定。並且SL和SR顏色也不能確定我們再此對SL和SR做 討論。(如果SL或SR爲黑色,那麼就必定爲NIL)

這裏寫圖片描述

接下來就對S、P、SL、SR的不同顏色組合做討論。


Case2-2-2-1:代DR爲空,也就是爲NIL,是黑色的。
若:
兄妹節點爲黑色,若P不能確定。
SL爲紅色,SR任意。 SL的子節點都爲NIL(爲什麼?看4,5)

爲了給P的左路徑增加一個黑點,那就只能從右邊子樹去借用一個了,那就借一個SL吧,反正他是紅色的,就算借走了也沒事,然後再把SL變成黑色就好了,就到了圖1。哎喲壞了,你左邊倒是多了一個黑點了,但是我右邊也有可能多一個黑點啊(如果P是紅色就沒有多,但是我們不知道P的顏色)有可能還是不平衡啊。好吧此時SL變成原來P的顏色也就是白色,P變成黑色就好了,如圖2.

這裏寫圖片描述


Case2-2-2-2:DR爲空,也就是爲NIL,是黑色的。
若:
兄妹節點爲黑色,若P不能確定。
SL爲任意,SR紅色。

爲了給P的左路徑增加一個黑點,那就只能從右邊子樹去借用一個了,SL又不知道顏色(如果是紅色的就是上面這樣的情況),只能借S了。左旋一次,就借來了S如圖1,此時左邊平衡。右邊也平 。。。等等,如果P是黑色的話右邊路徑不久少了一個黑點了?這樣也是不平衡的啊,我們要做的是不改變右邊路徑上黑色點的數量情況下,使左邊路徑黑點增加一個。好吧,將P和S顏色變一下總行了吧! 也就是圖2.

這裏寫圖片描述


Case2-2-2-3:DR爲空,也就是爲NIL,是黑色的。
若:
兄妹節點爲黑色,P爲紅色。
SL爲黑色,SR黑色。(只要S點的兒子爲黑色,必定爲NIL,看4,5性質)。

此時P爲紅色,S爲黑色。那麼我們有兩種選擇了:
一種將P改爲黑色(爲了增加左邊黑點),將S改爲紅色(爲了使得右邊黑點保持不變)。達到平衡。
另外一種以S爲支點左旋,此時左邊多了一個黑點,右邊不變。達到了平衡。

這裏寫圖片描述

Ps:我看很多博主都只有第一種方法,難道第二種方法是錯的?請教各位同學。


Case2-2-2-4:DR爲空,也就是爲NIL,是黑色的。
若:
兄妹節點爲黑色,P爲黑色。
SL爲黑色,SR黑色。

這中情況比較簡單,我們可以減少一個右邊路徑黑點,將S改爲紅色就可以,如右下圖。

或者增加左邊一個節點,將SL作爲根節點,此時達到平衡。什麼?你確定?沒錯啊,左邊增加了一個黑點,右邊黑點數量沒有變。別忘記了,SL和SR如果是黑色的(別問爲什麼了,看XXX),那就一定是NIL,那麼SL可以當節點??黑人問號。

所以答案只有一個,那就是右下圖。

這裏寫圖片描述


總結一下:

我們分析了使用了後繼法來刪除紅黑樹。

刪除點爲D,我們不知道他的顏色,但是肯定的是D的左兒子肯定爲NIL(D是最小的,沒有比D更小的了,所以爲NIL)。D的右兒子DR也不一定,P也不一定。也就是我們能唯一確定的是D的左兒子爲NIL

這裏寫圖片描述

於是我們對D、DR、P、S、SL、SR做了顏色的討論。

case1:D是紅色,DR肯定爲黑色,且爲NIL(別問爲什麼了。。。。)

case2:D是黑色:
- case2-1:D是黑色,DR不爲NIL,必爲紅色
- case2-2:D是黑色,DR爲NIL,必爲黑色

  • case2-2-1: case2-2條件+S節點爲紅色
  • case2-2-2:case2-2條件+S節點爲黑色

    • case2-2-2-1:case2-2-2+P不能確定,SL爲紅色,SR任意
    • case2-2-2-2:case2-2-2+P不能確定,SL爲任意,SR紅色
    • case2-2-2-3:case2-2-2+P爲紅色,SL爲黑色,SR黑色
    • case2-2-2-4:case2-2-2+P爲黑色,SL爲黑色,SR黑色

所有情況都分析完了,紅黑樹的刪除你會了嗎?

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