紅黑樹之二(刪除節點)

2021-06-23 03:29:04 字數 2572 閱讀 7503

**:

紅黑樹的另乙個重要的操作是刪除節點,它也可以分為兩步:

找到要刪除的節點,並刪除它

對樹進行調整使得樹滿足紅黑樹的要求

從排序樹中刪除節點的思路是一樣的,首先找到要刪除的節點,並做如下處理:

如果該節點不存在非空子節點,則直接刪除它

如果該節點存在乙個非空子節點,則用其非空子節點替換其位置即可

如果該節點有兩個非空子節點,則可以找到該節點的前驅或者後繼,然後更換兩個節點的元素值,再將前驅或者後繼當做被刪除的節點(由於任意乙個節點的前驅或者後繼都必定至多只有乙個非空子節點,因而刪除這樣的節點就可以按照前兩種情形進行處理)

紅黑樹也採取了類似的思路,假設要刪除的節點為a,則先找到節點a,然後:

如果節點a有兩個非空子節點,則找到節點a的前驅(也可以是後繼),然後記要刪除的元素b=a的前驅

否則只要a有乙個空子節點,就記要刪除的元素b=a

記變數x為b的第乙個非空子節點(先檢查左孩子,後檢查右孩子),如果b的兩個孩子都為空,則記x為空

如果b和a不同,則將b的內容拷貝到a

刪除節點b

如果被刪除節點b的顏色為紅色,則刪除結束,否則從節點x處開始對刪除節點後的紅黑樹進行調整

以下圖為例:

顯然,在這種處理方式下,如果b的顏色為紅色,則刪除它後刪除操作即完成了,因為:

如果b的顏色為黑色,則需要從節點x處開始對刪除節點後的紅黑樹進行調整。

刪除節點後的調整要根據n的不同情形來分情況處理。假設刪除節點後的樹中,n的父節點為p,兄弟節點為s,兄弟節點的左孩子為sl,兄弟節點的右孩子為sr。需要注意的是空節點是有顏色的,它是黑色的。

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

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

如下圖所示:

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

調整完後如下圖所示:

如下圖所示:

此時的處理很簡單,只需要將s和p的顏色互換即可完成調整。

調整完可以得到下圖:

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

此種情形如下圖所示:

此時的做法:

將以p為根的子樹進行左旋

交換p和s的顏色

將sr的顏色改為黑色

則可以得到下圖:

因而調整完成。

此種情形如下圖所示:

此時的做法是:

首先對以s為根節點的子樹進行右旋

然後交換s和sl的顏色,即s改為黑色,sl改為紅色

則可以得到下圖:

由於節點sl的左孩子在旋轉前後不變,而sl原來為紅色,所以sl的左節點必然為黑色,因而旋轉後,對於n節點來說,這就是情形5,按照情形5進行處理即可。因此總體上來說這種情形需要一次左旋,一次右旋。

由於s為紅色,所以p,sl,sr都必定為黑色,如下圖所示

此時的做法是:

首選對以p為根節點的子樹進行左旋

然後再將s和p的顏色互換,即修改s的顏色為黑色,p的顏色為紅色

則可以得到下圖:

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

紅黑樹(二)刪除

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

紅黑樹 刪除

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

紅黑樹(刪除)

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