紅黑樹

紅黑樹:一個二叉查找樹,紅黑樹也是平衡二叉樹的一種,但在每個結點上增加一個存儲位表示節點的顏色,可以是red或是black。

紅黑樹的性質:

1.每個結點或是紅的,或是黑的。

2.根結點是黑的。

3.每個葉結點是黑的空結點(NULL)。

4.如果一個結點是紅的,那它的兩個兒子都是黑的。

5.對每個結點,從該結點到其子孫結點的所有路徑上包含數目相同的黑結點。

最長路徑不超過最短路徑的2倍。

一個典型的紅黑樹:

向紅黑樹原樹插入一個結點時,如果不影響原來紅黑樹的平衡,則對原紅黑樹不需要進行操作。如果影響到了原紅黑樹的平衡,則需要對紅黑樹進行操作,使得紅黑樹達到平衡。

向原來的紅黑樹插入數值爲14的新結點時,由於父結點15是黑色結點,所以這種情況沒有破壞結構,不需要做任何改變。

但是向原樹插入21時,看下圖:

由於父結點22是紅色結點,因此這種情況打破了紅黑結點的規則4,必須做出調整,該如何進行調整呢,調整方法有四種,變色,旋轉,左旋轉,右旋轉。

1.變色:爲了符合紅黑樹的規則,會把結點紅變黑或者黑變紅,下圖展示的是紅黑樹的部分,需要注意結點25並非根結點,因爲21和22鏈接出現紅色,不符合規則4,所以把22紅變黑。

但這樣還是不符合規則5,所以需要把25黑變紅:

因爲25和27又是兩個連續的紅結點(規則4),所以需要靜27紅變黑。

2.左旋轉:也就是逆時針旋轉兩個結點,使父結點被自己的右孩子所取代,而自己成爲自己的左孩子(在移動時自己的孩子依然跟着自己的方向移動,並且方向不變)

右旋轉:順時針旋轉兩個結點,使得自己的父結點被左孩子取代,而自己成爲自己的右孩子。

古關於左旋右旋及紅黑樹的操作可以參考博客:https://blog.csdn.net/Sun_TTTT/article/details/65445754

紅黑樹的使用:在STL中的set , map以及Linux的虛擬內存管理都是使用紅黑樹。紅黑樹用來存儲有序的數據,時間複雜度時O(log n)

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