紅黑樹的插入3張圖讓你學會

紅黑樹的插入相比較其刪除是比較簡單的。總的分爲兩步:
第一步,找到節點位置,插入節點即可,默認插入的節點是紅色的(這樣不會影響平衡)。
第二步,將調整顏色,避免出現紅—紅的出現,這是紅黑樹不允許的。

再次強調紅黑樹的定義:
(1)每個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每個葉子節點(NIL)是黑色。 [注意:這裏葉子節點,是指爲空(NIL或NULL)的葉子節點!]
(4)如果一個節點是紅色的,則它的子節點必須是黑色的。
(5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。

默認插入點的顏色爲紅色。記住這些,就可以開始紅黑樹的插入啦,這裏我將用RBT簡化紅黑樹的名稱。

插入操作Case分析

我們假設插入點爲I,其父爲P,其兄爲S,其祖父爲G。

首先,如果P是黑色,那麼就直接插入I即可,無需其他後序調整,所以,我們主要討論的是P爲紅色的一些情況。

case1:P紅,U黑,I是左子樹

這種情況下,爲了避免紅—紅我們需要將P改爲黑色,G變成紅色,此時左端平衡,但是右邊少了黑點,爲了平衡,再執行一次以P爲根右旋。

此時左右平衡,滿足RBT的定義。

這裏寫圖片描述

case2:P紅,U黑,I是右子樹

此時需要將以I爲根節點執行一次左旋,如圖右;此時雖然還是存在紅—紅情況,但是此時這不就是case1所說的情況嘛?於是case2→case1,達到平衡。

這裏寫圖片描述

case3:P紅,U黑,I是P的左右子樹無關

將P、U變成黑色,G變成紅色,此時左邊不存在紅—紅點,但是G變成了紅色;這時我們就需要將G看成新的I節點,將問題往上拋,如果之後的情況還是case3,那麼再次繼續,,直到不能拋,也就是到達整個樹的根節點,此時只需要將G變成黑色的即可。

這裏寫圖片描述

從上面可知,對於P是紅色的情況下,各種其他不同的case都是通過操作變成case1的情況後達到平衡。

實例

下面的實例出現了上面所有的case。

一開始是Case3,然後變成了Case2,此時新的I爲60.

這裏寫圖片描述

Case2→Case1,此時新的I還爲60.

這裏寫圖片描述

在Case1情況下,我們執行一次右旋和變色操作,使樹成爲標準的RBT。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章