關於紅黑樹的插入和刪除

2021-07-10 12:03:06 字數 2419 閱讀 1677

定義:紅黑樹是一棵二叉搜尋樹。它在每個結點每個結點上新增乙個儲存位來表示顏色,可以是紅色或者黑色。通過對任何一條從根到葉子結點的簡單路徑上各個結點的顏色進行約束。紅黑樹保證確保沒有一條路徑會比其他路徑長出兩倍,因而近似是平衡的。

性質:(1)每個結點或者是紅色或者是黑色;

(2)根結點是黑色的;

(3)每個葉子結點是黑色的;(演算法導論中的設定,葉子結點都是null,null都是黑色的)

(4)如果乙個結點的顏色是紅色,那麼它的兩個子結點都是黑色的;

(5)對於每個結點,從該結點到其後代葉子結點的簡單路徑上,均包含相同數目的黑色結點。

插入操作中,先執行二叉搜尋樹的插入,然後在呼叫函式修復這顆紅黑樹,使其滿足紅黑樹的性質。

修復函式的額不變式是:

a. 結點z是紅色的結點;

b.如果z的父結點是根結點,根結點的顏色為黑色;

c.如果有任何的紅黑樹的性質被破壞,則至多破壞乙個,要麼是性質2,要麼是性質4。如果是性質2被破壞,其原因是因為z的父結點是根結點且紅色的。否則是性質4被破壞。在迴圈之中也可能破壞性質5,這時候就要執行旋轉來調節,路徑上的黑色結點數(在迴圈中的條件是,性質4被破壞):

1.把z的父結點變成黑色,z的父結點的父結點(如果有的話)變成紅色;從z的父結點的父結點開始的子樹上的黑色結點數目不變。

2.然後執行旋轉,保持z的父結點的父結點的兩顆子樹的上的黑色結點數目相等。

刪除操作的一開始的操作和二叉搜尋樹的刪除是很相似的。

先在要刪除的結點z的右子樹中找到z的後繼y,因為y是z的後繼,所以肯定沒有左孩子。用y替換z結點,y的顏色為z的顏色,因此這個替換不會破壞紅黑樹的性質。讓y的右孩子x替換y的位置,如果y的原來的顏色是黑色,那麼這個替換操作就會使x這顆子樹上的黑高變小,否則,沒有任何影響。

從上面的描述可以看出,刪除操作可能破壞的性質是性質5,從任何結點出發,到葉子結點的簡單路徑,經過的黑色結點數是相同的。

修復刪除操作帶來的破壞的操作是,在x上面附上已成額外的黑色,使得看起來滿足紅黑樹的性質,然後逐步上調。調整樹之間的平衡的手法是讓從x.parent.parent開始的子樹整個子樹的黑色結點數目保持不變。借助x的兄弟結點來調節平衡。

一開始的時候,我們設子樹是這樣的,a1上的黑高為n。b是要刪除的結點,c明顯就是要替換b的那個結點。

當將c替換b之後,d結點替換了c結點的位置,重新成為了e的右孩子。

此時,d1,d2

上的黑高為n - 2,a1,a2,c1,e1,e2上的黑高為n。

正如下圖所示,e的左子樹的黑高為n - 1,而右子樹的黑高為n,這是不平衡的,因此需要調整。

根據演算法導論中的假設,假設w為x的兄弟結點。每種情況的圖在演算法導論中也有給出,上面解釋的是為什麼會失衡:

case1:當w是紅色的時候:

因為x是黑色的,e的左子樹的黑高是n(n >= 1),而e的右子樹的根結點,也就是w的顏色是紅色的,所以,w必定有乙個黑色的子結點。把w的顏色和w.parent的顏色交換,變成黑色,執行左旋。並且保持整棵樹的

黑高不變。這時候,x的兄弟就變成原w的左孩子。必定是黑色或者為空。變成case2,3,4中的一種。

case2:當x的兄弟w的顏色是黑色,兩個孩子都為黑色或者都為空的時候:

先把x和w的一種黑色去掉,w變成紅色,x變成單重黑色的結點,然後在x的父結點上附上已成黑色。如果是從case1變換而來的,x的父結點就必定為紅色,附上一層黑色之後,整棵樹的黑高不變,父結點有紅黑色。讓x指向x.p

arent迴圈就會就會終止,並在迴圈外,將x的顏色變為黑色,維持黑高。

case3:當x的兄弟w的左孩子為黑色,左孩子的顏色有紅色,右孩子的顏色為黑色或者為空:

先把w的顏色和左孩子的顏色交換,然後將w右旋。這樣就變成了case4。

case4:但x的兄弟結點是黑色的,左孩子是黑色或者為空,右孩子的顏色是紅色:

附上一張圖說明這個情況,因為這個情況將會導致迴圈終止。假設有a1的黑高為n - 2,黑高的多少不會影響彼此之間的約束關係。

值得注意的是,e1, e2的黑高是n - 2, a1,a2,

d1, d2黑高是n - 2。(參考之前的那幾幅圖,就知道為什麼是n - 2了)

變換的時候,把x的父結點(圖中為c)的顏色賦值給w結點(圖中為e),然後將x的父結點(父結點的顏色不一定是黑色)的顏色置為黑色,w的右孩

子置為黑色。在執行了這些操作之後,可以得出下圖:

紅黑樹的插入和刪除

上一章講述了紅黑樹得相關性質,我們了解到紅黑樹確實是平衡二叉樹,在時間複雜度為o lg n 比二叉搜尋樹效能更好,效能變好的前提是演算法更加複雜了,下面講述紅黑樹的插入和刪除操作,希望對大家有所幫助。紅黑樹的插入操作和二叉搜尋樹大致相同,不同點是在將節點x插入紅黑樹後,此時的紅黑樹可能會違反紅黑樹的...

關於紅黑樹的插入

滿足下面幾個條件的二叉搜尋樹,稱為紅黑樹 1.任何乙個節點都被著色 紅色或是黑色。2.根節點是黑色的。3.所有的nil 節點都看成黑色 nil 節點是就是乙個假想的或是無實在意義的節點,所有應該指向null 的 指標,都看成指向了nil 節點。包括葉節點的子節點指標或是根節點的父指標 4.如果乙個節...

理解紅黑樹的節點插入和刪除

每個結點為紅色或者黑色 根結點為黑色 每個葉結點為黑色 如果乙個結點為紅色,則它的兩個子結點為黑色 對每個結點,從該結點到其後代葉子節點的簡單路徑上,均包含相同數目的黑色結點 這裡的葉結點不是指使用者在樹最底層插入的新結點點,而是插入新結點後,新結點的兩個為 nil 的左右孩子 紅黑樹的這 5 個性...