紅黑樹的刪除(算法導論)


紅黑樹的刪除分兩個部分介紹,第一個部分介紹節點的刪除;第二部分介紹在將節點刪除后對紅黑樹的調整,使得其能符合紅黑樹的性質。

1、節點的刪除

         假如要刪除的節點為z,這時,有三種情況:

         1)節點z沒有孩子節點,這時直接將z節點刪除,然后判斷節點z是否為黑色的,若z為黑色的,則在刪除后會導致黑高不相等。於是需要對紅黑樹進行調整,見第二部分。

         2)節點z只有一個孩子節點,此時直接使用其孩子節點代替z節點,然后判斷刪除的z節點是否為黑,若為黑,則需對紅黑樹進行調整。

         3)節點z有左右孩子節點,這時首先找到z節點的后繼節點y, 這時又有兩種情況:第一種情況是y是z的右孩子節點,第二種情況是y不是z的右孩子節點。當y不是z的右孩子時,這時需要把y節點從原來的地方剝離出來,然后替換掉節點z。並用y的右孩子x填補y的位置。

         注意,y不可能有左孩子節點,因為如果有左孩子節點則它的左孩子節點更有可能成為節點z的后繼。因而y節點要么沒有孩子節點,要么只有右孩子。


圖1.1

         在節點的刪除中,第一二種情況,若刪除的是紅色的則無需進行調整;若刪除的節點為黑色的,則需要對紅黑樹進行調整。

         在第三種情況中,通過使用z的后繼節點y替換z節點,然后使用y的右孩子x來填補y的位置。在此過程需要將節點y進行移動,由於移動之后的y節點保持原來z節點的顏色,而x節點在代替y節點之后可能會出現問題,當然只會在y節點是黑色的情況下才會出現問題,當y節點為紅色時,移動時紅黑樹的性質不會被破壞,y節點為黑色時,一定會出現黑高的不相等,並且也可能會出現兩個連續的紅色節點。這時需要對其進行下一步調整。

 

圖 1.2

2、紅黑樹的調整

         在上部分的第一二種情況中,若刪除的節點z為黑色的,這時,為了保持黑高不被破壞,我們可以將替代z的節點x再加一種再額外增加一種黑色。此時節點x可能是雙黑或者紅黑,若為紅黑則只需刪除其中的紅色保留黑色即可,若為雙黑色則需要做進一步的調整。

         在上部分第三種情況中,若移動的節點y是黑色的,則將代替節點y的節點x額外增加一種黑色,使得樹的黑高相等。同樣,此時的x節點可能為雙重黑色或紅黑色,若是紅黑色則只需保留黑色即可,若為雙黑色則需要對樹進行調整。

         當節點x具有雙重黑色的特性時需要對其進行調整。這時有兩種情況,分別為:x是左孩子節點和x是右孩子節點。由於這兩種情況是對稱的,因而在此只對x是左孩子節點的情況進行討論。

         當x為左孩子節點時,這時又有四種情況。

1)x的兄弟節點w是紅色的。這種情況不好處理,因為x的兄弟節點w為紅色,不能將黑色直接上移。所以對其做一些變換,首先將w變成黑色,x的父節點變成紅色,然后以x.p為中心進行左旋。旋轉后的x的兄弟節點為原來w的左孩子,此節點必為黑色,因為w為紅色。通過這一步,我們就能確保x的兄弟節點為黑色,為下一步調整做好准備。


圖 2.1

2)x的兄弟節點w是黑色的,並且w的兩個子節點也是黑色的。此種情況比較好辦,我們可以通過將x和w中的一個黑色上移到x的父節點,使得x的父節點變成新的x節點。在將x上的一個黑色上移后還剩下了一個黑色,將w的黑色上移后w只剩下了紅色。若新的x為紅黑色,則將新的x變成黑色,調整結束;若新的x為雙黑色時,並且此時的x不為根節點,則繼續進行調整,否則結束。


圖2.2

3)x的兄弟節點w是黑色的,並且w的左孩子為紅色,右孩子為黑色。這種情況不能提取x和w的黑色上移,因為w的孩子有紅色節點。此種情況w的左孩子為紅色,右孩子為黑色。我們首先以w為中心進行右旋,並且將w的左孩子的顏色修改為黑色,將w修改為紅色。這時將此種情況轉化成了第四種情況,即x的兄弟節點w的右孩子為紅色節點。


圖 2.3

4)x的兄弟節點w是黑色的,並且w的右孩子為紅色,左孩子顏色任意。這時,首先將w的顏色改為其父節點的顏色,x的父節點和w的右孩子修改為黑色。然后以x的父節點為中心進行左旋,最后將x指向其根節點。


圖 2.4

最后,有一個問題,在刪除或移動黑色節點時,需要將他的黑色下推給他的孩子節點。若孩子節點為空,這時將無法將黑色下推。若黑色向上推則會導致黑高的不相等。這時如何解決?



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM