紅黑樹 刪除

2021-06-09 17:42:19 字數 2868 閱讀 9182

分類: 演算法筆記

2011-09-07 21:49

318人閱讀收藏

舉報 一、紅黑樹的節點刪除

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

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

w以及w的兩個子節點c1和c1的一共有五種組合,便有兩種情況的處理是一致的,因此調整的過程可以分以下四個情況:

第一種情況:w是紅色節點

如上圖,如果w是紅色的,那麼b和d節點進行一次左旋,並把d(也就是原來的w)著為黑色,b節點(x的父節點)著為紅色。然後讓w指向x的新兄弟。這樣,就把這種情況轉化為了w為黑色的情況來解決。在這個變形中,這五個節點之間保持了紅黑性質不變,而x指向的雙黑色節點的位置和顏色特性都沒有變化。變形後的情況如何解決呢?下面的都是w為黑色的問題,因此下面三種中總有一種會合適。

ps:有沒有其它變形呢?有,比如c和d進行右旋,b節點變為紅色,變形後五個節點紅黑正確的,但是這五個節點與樹的其它部分相接處可能會產生問題,這樣要考慮的因素就太多了。

第二種情況:w以及w的兩個子節點都是黑色的

如上圖,注意,b即可以是紅色也可以是黑色。

這種情況下,把d節點著成紅色。然後把x的乙個黑色推到父節點b中去,這時x就指向b節點了。變形前後,這五個節點間的黑高是沒有變化的。

唯一可能產生問題的就是如果b原來是紅色,那麼b和d兩個紅色相鄰就破壞了第4個性質,這樣新x的子樹就有問題了。這本來不符合我們向上遞迴的假設。但正好在這種情況下遞迴就可以結束了。因為b節點原來是紅色,現在雙加一層黑色,那麼x現在指向的這個節點就是紅黑兩色的,直接把x(也就是b)著為黑色。問題就已經完整解決了。

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

第三種情況:w的左子節點是紅色的且右子節點是黑色。

如上圖,b即可以是黑色也可以是紅色。

把c和d進行一次旋轉,改變c和d的顏色變形成新的結構。把問題轉化成w的右子節點為紅色的情況來解決。注意,原來c是紅色的,所以c的子節點一定是黑色的,所以旋轉中c節點的乙個子樹掛到之後著為紅色的d節點上不會破壞紅黑性質。變形後黑高度不變。

第四種情況:w的右子節點是紅色(左子節點可以是紅色或黑色)

如上圖,b節點可以是紅色或是黑色。

將b和d進行一次左旋,並交換兩者的顏色。再將e著為黑色。這時,只要將x的一層黑色脫去,整個問題也得到了解決。遞迴結束。(在**上,為了標識遞迴結束,我們把x指向根節點)

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

參看文獻:

紅黑樹(刪除)

相對於紅黑樹插入操作,刪除操作複雜的多。第一 先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖 只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。黑色節點沒有增多也沒有減少。注意 以下幾種單支情況在平衡的紅黑樹中不可能出現。因為上述的情況,紅黑樹處於不平衡狀態。破壞...

紅黑樹刪除

相對於紅黑樹插入 操作,刪除操作複雜的多。第一 先看最簡單情況,即刪除紅色節點。刪除紅色節點,不影響紅黑樹平衡性質,如圖 只需要刪除紅色節點,不需要進行調整,因為不影響紅黑樹的性質。黑色節點沒有增多也沒有減少。注意 以下幾種單支情況在平衡的紅黑樹中不可能出現。因為上述的情況,紅黑樹處於不平衡狀態。破...

紅黑樹的刪除

一 紅黑樹的節點刪除 從紅黑樹上刪除乙個節點,可以先用普通二叉搜尋樹的方法,將節點從紅黑樹上刪除掉,然後再將被破壞的紅黑性質進行恢復。我們回憶一下普通二叉樹的節點刪除方法 z指向需要刪除的節點,y指向實質結構上被刪除的結點,如果z節點只有乙個子節點或沒有子節點,那麼y就是指向z指向的節點。如果z節點...