原文:
可能出現的情形討論
刪除紅黑樹中乙個結點,刪除的結點是其子結點狀態和顏色的組合。子結點的狀態有三種:無子結點、只有乙個子結點、有兩個子結點。顏色有紅色和黑色兩種。所以共會有6種組合。
組合1:被刪結點無子結點,且被刪結點為紅色
此時直接將結點刪除即可,不破壞任何紅黑樹的性質。
組合2:被刪結點無子結點,且被刪結點為黑色
處理方法略微複雜,稍後再議。
組合3:被刪結點有乙個子結點,且被刪結點為紅色
這種組合是不存在的,如圖假如被刪結點node只有乙個有值的子結點value,而以value為根結點的子樹中,必然還存在null結點,如此不符合紅黑樹的性質5,對每個結點,從該結點到其所有後代葉結點的簡單路徑上,均包含相同數目的黑色結點。
組合4:被刪結點有乙個子結點,且被刪結點為黑色
這種組合下,被刪結點node的另乙個子結點value必然為紅色,此時直接將node刪掉,用value代替node的位置,並將value著黑即可。
組合5&6:被刪結點有兩個子結點,且被刪結點為黑色或紅色
當被刪結點node有兩個子結點時,先要找到這個被刪結點的後繼結點successor,然後用successor代替node的位置,同時著成node的顏色,此時相當於successor被刪。
因為node有兩個子結點,所以successor必然在node的右子樹中,必然是下圖兩種形態中的一種。
若是(a)的情形,用successor代替node後,相當於successor被刪,若successor為紅色,則變成了組合1;若successor為黑色,則變成了組合2。
若是(b)的情形,用successor代替node後,相當於successor被刪,若successor為紅色,則變成了組合1;若successor為黑色,則變成了組合2或4。
綜上
若被刪結點是組合1或組合4的狀態,很容易處理;被刪結點不可能是組合3的狀態;被刪結點是組合5&6的狀態,將變成組合1或組合2或組合4。
再議組合2:被刪結點無子結點,且被刪結點為黑色
因為刪除黑色結點會破壞紅黑樹的性質5,所以為了不破壞性質5,在替代結點上額外增加乙個黑色,這樣不違背性質5而只違背性質1,每個結點或是黑色或是紅色。此時將額外的黑色移除,則完成刪除操作。
然後再結合node原來的父結點father和其兄弟結點brother來分析。
情形一
brother為黑色,且brother有乙個與其方向一致的紅色子結點son,所謂方向一致,是指brother為father的左子結點,son也為brother的左子結點;或者brother為father的右子結點,son也為brother的右子結點。
圖(c)中,白色代表隨便是黑或是紅,方形結點除了儲存自身黑色外,還額外儲存乙個黑色。將brother和father旋轉,並重新上色後,變成了圖(d),方形結點額外儲存的黑色轉移到了father,且不違背任何紅黑樹的性質,刪除操作完成。
圖(c)中的情形顛倒過來,也是一樣的操作。
情形二
brother為黑色,且brother有乙個與其方向不一致的紅色子結點son
圖(e)中,將son和brother旋轉,重新上色後,變成了圖(f),情形一。
圖(e)中的情形顛倒過來,也是一樣的操作。
情形三
brother為黑色,且brother無紅色子結點
此時若father為紅,則重新著色即可,刪除操作完成。如圖下圖(g)和(h)。
此時若father為黑,則重新著色,將額外的黑色存到father,將father作為新的結點進**形判斷(不刪除),遇到情形
一、情形二,則進行相應的調整,完成刪除操作;如果沒有,則結點一直上移,直到根結點儲存額外的黑色,此時將該額外的黑色移除,即完成了刪除操作。
情形四
brother為紅色,則father必為黑色。
圖(i)中,將brother和father旋轉,重新上色後,變成了圖(j),新的brother變成了黑色,這樣就成了情形
一、二、三中的一種。如果將son和brother旋轉,無論怎麼重新上色,都會破壞紅黑樹的性質4或5,例如圖(k)。
圖(i)中的情形顛倒過來,也是一樣的操作。
紅黑樹刪除操作
紅黑樹刪除操作 紅黑樹要刪除某個key值時,首先還是要查詢該key值在樹中的位置,查詢方法和搜尋二叉樹方法相同 要刪除的結點分為兩種情況 有左右兩個孩子都存在 兩個孩子都存在時,在該節點的右子樹中尋找其直接後繼,找到後用其值替換要刪除節點的值,然後問題轉化為刪除該節點的直接後繼,直接後繼是有乙個右孩...
紅黑樹 3 刪除操作
在本系列的前面兩篇文章中。已經介紹了紅黑樹以及其插入操作。紅黑樹 2 插入操作 類似於插入操作。紅黑樹進行刪除節點時,也使用又一次著色以及旋轉這兩種方式。來維護它的屬性。在插入操作中,我們主要是依靠檢測叔節點的顏色來決定哪種場景。在刪除操作中,我們使用檢測兄弟的顏色,來決定是哪種場景。在插入操作中,...
紅黑樹 刪除
分類 演算法筆記 2011 09 07 21 49 318人閱讀收藏 舉報 一 紅黑樹的節點刪除 從紅黑樹上刪除乙個節點,可以先用普通二叉搜尋樹的方法,將節點從紅黑樹上刪除掉,然後再將被破壞的紅黑性質進行恢復。我們回憶一下普通二叉樹的節點刪除方法 z指向需要刪除的節點,y指向實質結構上被刪除的結點,...