紅黑樹的特性:
(1)每個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每個葉子節點(nil)是黑色。 [注意:這裡葉子節點,是指為空(nil或null)的葉子節點!]
(4)如果乙個節點是紅色的,則它的子節點必須是黑色的。
(5)從乙個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。[這裡指到葉子節點的路徑]
當新新增乙個節點到樹中後,將其顏色置為red,遵循以下原則對整個樹進行調整:
1、 當插入的節點的父節點為null,則將該節點顏色置為black。
2、 當插入節點的父節點顏色為black,不需要調整。
3、 當插入節點的父節點為red,其叔父節點亦為紅色,則將其父親節點和叔父節點置為black,同時將祖父節點置為red,將祖父節點設定為當前新增節點,重新按照從規則1開始判斷。
4、 但插入節點的父親節點為red,其叔父節點為black或null,則需要分多鐘情況考慮。
a) 新增節點為父親節點右孩子同時父親節點是祖父節點的左孩子,則進行左旋,將父節點置為新節點,重新按照規則1進行判斷;
b) 新增節點為父親節點左孩子,同時父親節點是租戶節點的右孩子,則進行右旋,將父節點置為新節點,重新按照規則1進行判斷;
5、 不滿足上述所有條件,將父節點置為black,同時,將祖父節點置為red,進行以下兩種情況判斷。
a) 如果新增節點是父親節點的左孩子,同時,父親節點是祖父孩子的左孩子,則對祖父節點進行右旋
b) 其他情況,對祖父節點左旋。
通過以下序列來實現:35、75、65、56、78、29、41、37、38
第一步,首先加入35,只有根節點,按照規則1,將其顏色設定為black。
第二步,新增75節點,由於75節點的值大於當前根節點的值35,因此需要新增到根節點右側,根據規則2,其父親節點為black,不需要調整。
第三步,新增65節點,由於65大於35且小於75,因此,需要新增在75節點的左節點。根據規則4(a)規則進行調整,對父親節點進行右旋,之後按照5(b),進行調整後,滿足條件不需要再次調整。得到如下結果。
第三步,將56新增到現有的結果中,需要對先按照規則3進行調整,之後按照規則1調整,得到如下結果。
第四步,將78新增到現有的樹中,為75的右節點,滿足條件2不需要進行調整。
第五步,將29新增的樹中。滿足條件2不需要進行調整。
第六步。將41新增的樹中,按照規則3對其進行顏色調整,之後在按照規則2進行調整,滿足條件。
第七步,將37新增到樹中,需要進行5(b)調整。
第八步,將38新增到樹中,按照條件3進行調整,將37和56置black,同時,將41置為red,將41節點置為當前節點重新判斷;之後按照4(a)進行調整,將父節點35置為新節點,繼續判斷;按照5(a)進行最後調整,滿足條件。
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹筆記 紅黑樹的插入操作
紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...