紅黑樹刪除 自己總結篇

2021-06-28 07:03:01 字數 3699 閱讀 7436

從紅黑樹上刪除乙個節點,可以先用普通二叉搜尋樹的方法,將節點從紅黑樹上刪除掉,然後再將被破壞的紅黑性質進行恢復。

首先我們來看看

普通二叉樹的節點刪除方法:

我們回憶一下普通二叉樹的節點刪除方法:z指向需要刪除的節點,y指向實質結構上被刪除的結點,如果z節點只有乙個子節點或沒有子節點,那麼y就是指向z指向的節點。如果z節點有兩個子節點,那麼y指向z節點的後繼節點(其實前趨也是一樣的),而z的後繼節點絕對不可能有左子樹。因此,僅從結構來看,二叉樹上實質被刪除的節點最多隻可能有乙個子樹。

現在我們來看看

紅黑性質的恢復過程:

①如果y指向的節點是個紅色節點,那麼直接刪除掉y以後,紅黑性質不會被破壞。操作結束。

②如果y指向的節點是個黑色節點,那麼就有幾條紅黑性質可能受到破壞了。首先是包含y節點的所有路徑,黑高度都減少了一(第5條被破壞)。其次,如果y的有紅色子節點,y又有紅色的父節點,那麼y被刪除後,就出現了兩個相鄰的紅色節點(第4條被破壞)。最後,如果y指向的是根節點,而y的子節點又是紅色的,那麼y被刪除後,根節點就變成紅色的了(第2條被破壞)。

其中,第5條被破壞是讓我們比較難受的。因為這影響到了全域性。這樣動作就太大太複雜了。而且在這個條件下,進行其它紅黑性質的恢復也很困難。所以我們首先解決這個問題:如果不改變含y路徑的黑高度,那麼樹的其它部分的黑高度就必須做出相應的變化來適應它。所以,我們想辦法恢復原來含y節點的路徑的黑高度。做法就是:無條件的把y節點的黑色,推到它的子節點x上去。(x可能是nil節點)。這樣,x就可能具有雙重黑色,或同時具有紅黑兩色,也就是第1條性質被破壞了。(這個很重要)

但第1條性質是比較容易恢復的:

一、如果x是同時具有紅黑兩色,那麼好辦,直接把x塗成黑色,就行了。而且這樣把所有問題都解決了。因為將x變為黑色,2、4兩條如果有問題的話也會得到恢復,演算法結束。

二、如果x是雙黑色,那麼我們希望把這種情況向上推一直推到根節點(調整樹結構和顏色,x的指向新的雙黑色節點,x不斷向上移動),讓根節點具雙黑色,這時,直接把x的一層黑色去掉就行了(因為根節點被包含在所有的路徑上,所以這樣做所有路徑同時黑高減少一,不會破壞紅黑特徵)。(雙黑調節就是按照這種思路:無限把雙黑節點上推,直到出現第四種情況)

下面就具體地分析如何恢復1、2、4三個可能被破壞的紅黑特性:我們知道,如果x指向的節點是有紅黑兩色,或是x是根節點時,只需要簡單的對x進行一些改變就行了。要對除x節點外的其它節點進行操作時,必定是這樣的情況:x節點是雙層黑色,且x有父節點p。由知可知,x必然有兄弟節點w,而且這個w節點必定有兩個子節點。(

因為這是原樹滿足紅黑條件要求而自然具備的。x為雙黑色,那麼p的另乙個子節點以下一定要有至少兩層的節點,否則黑色高度不可能和x路徑一致。也就是說至少兩層黑。其實可以說,這就是乙個遞迴函式的遞迴公式,只不過情況較多而已。可以參看july的最長子字串序列,和這種情況類似

)。所以我們就分析這些節點之間如何變形,把問題限制在比較小的範圍內解決。另乙個前提是:x在一開始,肯定是樹底的葉節點或是nil節點,所以在遞迴向上的過程中,每一步都保證下一步進行時,至少 x的子樹是滿足紅黑特性的。因此子樹的情況就可以認為是已經正確的了,這樣,分析就只限制在x節點,x的父節點p和x的兄弟節點w,以及w的兩個子節點。這些個節點中。

下面僅僅考慮x原本是黑色的情況即可。

在這種情況下,x此時應該具有雙重黑色,演算法的過程就是將這多出的一重黑色向上移動,直到遇到紅節點或者根節點。

接著往下分析, 會遇到4種情況,實際上是8種, 因為其中4種是相互對稱的,這可以通過判斷x是其父節點的右孩子還是左孩子來區分。下面我們以x是其父節點的左孩子的情況來分析這4種情況,實際上接下來的調整過程,就是要想方設法將經過x的所有路徑上的黑色節點個數增加1。

具體分為以下四種情況:(下面針對x是左兒子的情況討論,右兒子對稱)

case1:

x的兄弟w是紅色(想辦法將其變為黑色)

由於w是紅色的,因此其兒子節點和父節點必為黑色,只要將w和其父節點的顏色對換,在對

父節點進行一次左旋轉,便將w的左子

節點放到了x的兄弟節點上,x的兄弟節點變成了黑色,且紅黑性質不變。但還不算完,只是暫時將情況1轉變成了下面的情況2或3或4。(

本來x 為雙黑,只要把a再塗成雙黑就完事了,和我們之前說過的要把雙黑往上推一樣,但那樣對問題根本沒一點影響,還不如不做。其實旋轉是可以想象到的,左邊x的刪除了乙個黑節點,那必然導致右邊重了,要左旋轉

x的兄弟節點w是黑色的,而且w的兩個子節點都是黑色的。此時可以將x的一重黑色和w的黑色同時去掉,而轉加給他們的父節點上,這是x就指向它的父節點了,因此此時父節點具有雙重顏色了。這一重黑色節點上移。(

因為a下面是平衡的,所以不用改動,但x要把一層黑給頂上去,那w這邊就相當於多了一層黑,所以把w的黑給去掉,成為紅色。至於a怎麼辦,那要看a本身的顏色是什麼了。如下:

圖二如果父節點原來是紅色的,現在又加一層黑色,那麼x現在指向的這個節點就是紅黑兩色的,直接把x(也就是父節點)著為黑色。問題就已經完整解決了。

如果父節點現在是雙層黑色,那就以父節點為新的x進行向上的下一次的遞迴。

case3:

x的兄弟節點w是黑色的,而且w的左子節點是紅色的,右子

節點是黑色的。此時通過交換w和其左子節點的顏色並進行一次向右旋轉就可轉換成下面的第四種情況。注意,原來l是紅色的,所以l的子節點一定是黑色的,所以旋轉中l節點的乙個子樹掛到之後著為紅色的w節點上不會破壞紅黑性質。變形後黑色高度不變。(

l旋轉後,左子樹的性質是不會變的,但右子樹多了個黑的w 就有問題了,所以要把w改為紅色。其實case3是把問題轉換為case4.

x的兄弟節點w是黑色的,而且w的右子節點是紅色的。這種情況下,做一次左旋,w就處於根的位置,將w保持為原來的根的位置的顏色,同時將w的兩個新的兒子節點的顏色變為黑色,去掉x的一重黑色。這樣

整個問題也就得到了解決。遞迴結束。(在**上,為了標識遞迴結束,我們把x指向根節點) (

其實是相當於 x這邊多了一層黑,怎麼辦呢,就把a點給按下去,這樣x兩層黑就變為 x本身黑+

a的黑。a是下去了,那自然要把w給提上來,w提上來之後l就變到左邊去了。l子樹保持不變,原因很簡單,都是兩層黑+l本身。但w提上來了,可這邊少了一層黑啊,所以直接把r變為黑,ok 問題解決了。

因此,只要按上面四種情況一直遞迴處理下去,x最終總會指向根結點或乙個紅色結點,這時我們就可以結束遞迴並把問題解決了。

以上就是紅黑樹的節點刪除全過程

總結:

如果我們通過上面的情況畫出所有的分支圖,我們可以得出如下結論

插入操作:解決的是 紅-紅 問題

刪除操作:解決的是 黑-黑 問題

即你可以從分支圖中看出,需要往上遍歷的情況為紅紅(插入),或者為黑黑黑(刪除)的情況,如果你認真分析並總結所有的情況後,並堅持下來,紅黑樹也就沒有想象中的那麼恐怖了,並且很美妙。

紅黑樹學習總結 二 之刪除篇

紅黑樹的五條性質 每個節點非紅即黑 根節點為黑 紅節點的兩個子節點都為黑 每個葉子節點都為黑 對於任一節點而言,其到葉子節點的每一條路徑都包含相同數目的黑節點 說真的在學紅黑樹的時候,看網上寫的部落格真的是一臉懵逼,完全不知道在講什麼東西,身邊的同事也沒有對它比較理解的,以至於我學了整整2天才把紅黑...

紅黑樹學習總結 刪除

看了蠻多種講解,個人感覺這個專欄情況分得比較細,比較適合我這樣頭腦不太靈光的初學者一些。一步簡化 如果需要刪除的結點有兩個孩子,我們的做法是找到這個結點的中序後繼,將後繼結點中的資料拷貝至待刪除結點,然後刪除後繼結點。而後繼結點必然最多只有乙個子結點,這樣我們就把刪除兩個孩子的結點轉為刪除乙個孩子的...

紅黑樹 刪除

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