紅黑樹的特性:
(1)每一個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每一個葉子節點(NIL)是黑色。 [注意:這裏葉子節點,是指爲空(NIL或NULL)的葉子節點!]
(4)若是一個節點是紅色的,則它的子節點必須是黑色的。
(5)從一個節點到該節點的子孫節點的全部路徑上包含相同數目的黑節點。[這裏指到葉子節點的路徑]html
當新添加一個節點到樹中後,將其顏色置爲red,遵循如下原則對整個樹進行調整:htm
一、 當插入的節點的父節點爲null,則將該節點顏色置爲black。blog
二、 當插入節點的父節點顏色爲black,不須要調整。io
三、 當插入節點的父節點爲red,其叔父節點亦爲紅色,則將其父親節點和叔父節點置爲black,同時將祖父節點置爲red,將祖父節點設置爲當前新增節點,從新按照從規則1開始判斷。im
四、 但插入節點的父親節點爲red,其叔父節點爲black或null,則須要分多鐘狀況考慮。d3
a) 新增節點爲父親節點右孩子同時父親節點是祖父節點的左孩子,則進行左旋,將父節點置爲新節點,從新按照規則1進行判斷;db
b) 新增節點爲父親節點左孩子,同時父親節點是租戶節點的右孩子,則進行右旋,將父節點置爲新節點,從新按照規則1進行判斷;img
五、 不知足上述全部條件,將父節點置爲black,同時,將祖父節點置爲red,進行如下兩種狀況判斷。紅黑樹
a) 若是新增節點是父親節點的左孩子,同時,父親節點是祖父孩子的左孩子,則對祖父節點進行右旋di
b) 其餘狀況,對祖父節點左旋。
經過如下序列來實現:3五、7五、6五、5六、7八、2九、4一、3七、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)進行最後調整,知足條件。
紅黑樹在線生成連接:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html