紅黑樹的刪除分兩個部分介紹,第乙個部分介紹節點的刪除;第二部分介紹在將節點刪除後對紅黑樹的調整,使得其能符合紅黑樹的性質。
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
最後,有乙個問題,在刪除或移動黑色節點時,需要將他的黑色下推給他的孩子節點。若孩子節點為空,這時將無法將黑色下推。若黑色向上推則會導致黑高的不相等。這時如何解決?
紅黑樹的刪除(演算法導論)
紅黑樹的刪除分兩個部分介紹,第乙個部分介紹節點的刪除 第二部分介紹在將節點刪除後對紅黑樹的調整,使得其能符合紅黑樹的性質。1 節點的刪除 假如要刪除的節點為z,這時,有三種情況 1 節點z沒有孩子節點,這時直接將z節點刪除,然後判斷節點z是否為黑色的,若z為黑色的,則在刪除後會導致黑高不相等。於是需...
紅黑樹(演算法導論)
測試 所用的例子為算導第三版p179圖13 4 include using namespace std const bool black 0 黑色 const bool red 1 紅色 struct node 結點結構 class rb tree 初始化nil結點和root node left r...
演算法導論 紅黑樹
原文 組內培訓,講紅黑樹,找出演算法導論,啃了乙個週末,其中插入結點很簡單,刪除結點有點複雜,但跟著演算法導論上一步一步來沒有什麼問題。不想備份blog的,所以沒有把上穿。可直接察看ppt。紅黑樹性質 1.每個節點或是紅的,或是黑的 2.根節點是黑的 3.每個葉結點 nil 都是黑的 4.如果乙個結...