紅黑樹學習筆記(3) 刪除操作

2022-05-15 23:45:31 字數 4145 閱讀 3763

1、設刪除的節點為$z$,另外定義節點$x,y$如下:

$y=\left\z & z的左孩子或右孩子為空節點\\ successor(z) & otherwise\end\right.$

$x=\left\y.left & y的左孩子不為空\\ y.right & otherwise\end\right.$

其中$successor$函式的定義在這裡

接下來,用$x$替換節點$y$,所謂的替換就是$x$的父節點指向$y$的父節點,如果$y$是其父節點的左孩子,那麼就讓$y$的父節點的左孩子指向$x$,否則讓$y$的父節點的右孩子指向$x$。然後令$z節點的值=y節點的值$.這樣操作之後,實際上就是刪掉了$z$節點。那麼現在看節點$y$,其實是刪掉了$z$節點的值和$y$節點的顏色,所以如果$y$節點的顏色是紅色,那麼本次刪除操作就結束了,因為樹的所有性質沒有被破壞。相反如果$y$ 是黑色的,那麼經過節點$x$的路徑將會比不經過$x$的路徑的黑色節點數少1。這種情況會修復節點$x$。下面是這個修復的過程。

2 首先假設$x$是其父節點的左孩子($x$是其父節點的右孩子的情況跟這個完全類似)。整個修復過程有四種情況。在修復的過程中,這四種情況之間的轉換關係如下圖所示:

也就是,如果是情況1,將會把情況1轉換為情況2或者情況3、4,如果是情況3則會將其轉換成情況4。

設$w$是$x$的兄弟節點。另外,在所有的情況中,滿足這樣的條件,就是經過節點$x$的路徑將會比不經過$x$的路徑的黑色節點數少1。

情況1: $w$的顏色為紅色。這時候$x$父節點的顏色一定為黑色。如下圖所示。首先將置$x$的父節點色顏色為紅色,置$w$的顏色為黑色,然後左旋$x$的父節點,並重新令$w=x的兄弟節點$。這樣,情況1將會轉換為情況2或者情況3,4,也就是說情況2、3、4的$w$節點都是黑色。

情況2:$w$是黑色,$w$的兩個孩子都是黑色。注意這時候$x$的父節點的顏色可能是紅色也可能是黑色,下圖是紅色的情況,但是這兩種情況執行的操作都是一樣的。這時將$w$的顏色置為紅色,然後令$x=x的父節點$。

情況3:$w$是黑色,$w$的右孩子是黑色(此時$w$的左孩子一定是紅色,否則就是情況2了)。注意這時候$x$的父節點的顏色可能是紅色也可能是黑色,下圖是紅色的情況,但是這兩種情況執行的操作都是一樣的。如下圖所示。這種情況操作之後,將把$w$的右孩子轉成紅色節點,這也是情況4.現在交換$w$與其左孩子的顏色,然後右旋$w$,最後令$w=x現在的兄弟$

情況4:$w$是黑色,$w$的右孩子是紅色。注意這時候$x$的父節點的顏色可能是紅色也可能是黑色,下圖是紅色的情況,但是這兩種情況執行的操作都是一樣的。首先交換$w$與其父節點的顏色,然後置$w$的右孩子為黑色,最後左旋$x$的父節點。這一步之後可結束整個修復過程。

紅黑樹 3 刪除操作

在本系列的前面兩篇文章中。已經介紹了紅黑樹以及其插入操作。紅黑樹 2 插入操作 類似於插入操作。紅黑樹進行刪除節點時,也使用又一次著色以及旋轉這兩種方式。來維護它的屬性。在插入操作中,我們主要是依靠檢測叔節點的顏色來決定哪種場景。在刪除操作中,我們使用檢測兄弟的顏色,來決定是哪種場景。在插入操作中,...

紅黑樹刪除操作

紅黑樹刪除操作 紅黑樹要刪除某個key值時,首先還是要查詢該key值在樹中的位置,查詢方法和搜尋二叉樹方法相同 要刪除的結點分為兩種情況 有左右兩個孩子都存在 兩個孩子都存在時,在該節點的右子樹中尋找其直接後繼,找到後用其值替換要刪除節點的值,然後問題轉化為刪除該節點的直接後繼,直接後繼是有乙個右孩...

紅黑樹的刪除操作

原文 可能出現的情形討論 刪除紅黑樹中乙個結點,刪除的結點是其子結點狀態和顏色的組合。子結點的狀態有三種 無子結點 只有乙個子結點 有兩個子結點。顏色有紅色和黑色兩種。所以共會有6種組合。組合1 被刪結點無子結點,且被刪結點為紅色 此時直接將結點刪除即可,不破壞任何紅黑樹的性質。組合2 被刪結點無子...