數據結構---紅黑樹

一、在理解紅黑樹之前,先看一些二叉查找樹

二叉查找樹特性:左字數上所有的節點的值都小於或等於他的根節點上的值

                             右子樹上所有節點的值均大於或等於他的根節點的值

                             左、右子樹也跟別爲平衡二叉樹

      舉個二叉樹的例子:

            

      可以看到如果要查詢10的話,10>9

            

      因此到他的右子樹,右子樹根節點爲13,10<13

            

      因此到其左子樹,左子樹根節點爲11>10

            

      到其左子樹,爲10,找到相應的節點

            

      不過二叉查找樹有一些問題,可能會出現不平橫的情況,即如下圖所示的情況

            

      從這種情況可以看出,明顯存在左子樹和右子樹深度相差過多,在使用平衡情況下的二叉查找樹是時間複雜度爲logn,而出現這種極端情況的話,想要查9的位置就需要每一次都遍歷下一個右子樹,很有可能時間複雜度變爲n(與數組普通查詢的時間複雜度相同)

      基於上述情況,引入了平衡二叉樹,紅黑樹即爲平衡二叉樹的一種

二、紅黑樹

特性:節點是紅色或黑色

           根節點一定是黑色

           每個葉節點都是黑色的空節點(NIL節點)

          每個紅節點的兩個子節點都是黑色的(從每個葉子到跟的所有路徑上不能有兩個連續的紅節點)(即對於層來說除了NIL節點,紅黑節點是交替的,第一層是黑節點那麼其下一層肯定都是紅節點,反之一樣)

          從任一節點到其每個葉子節點的所有路徑都包含相同數目的黑色節點

 

      正是由於這些原因使得紅黑樹是一個平衡二叉樹

紅黑樹的例子

            

向紅黑樹中插入節點14(一般默認插入節點是紅色的)

            

在原樹上插入20

            

      可以看到,插入以後樹已經不是一個平衡的二叉樹,而且並不滿足紅黑樹的要求,因爲20和21均爲紅色,這種情況下就需要對紅黑樹進行變色,21需要變爲黑色,22就會變成紅色,如果22變成紅色,則需要17和25都變成黑色

            

      而17變成黑色顯然是不成立的,因爲如果17變爲黑色,那麼13就會變爲紅色,不滿足二叉樹的規則,因此此處需要進行另一個操作---------左旋操作

      左旋:下圖就是一個左旋的例子,一般情況下,如果左子樹深度過深,那麼便需要進行左旋操作以保證左右子樹深度差變小

            

      對於上圖由於右子樹中17變爲黑色以後需要把13變成紅色,因此進行一次左旋,將17放在根節點,這樣既可保證13爲紅色,左旋後結果

            

      而後根據紅黑樹的要求進行顏色的修改

            

      進行左旋後,發現從根節點17,到1左子樹的葉子節點經過了兩個黑節點,而到6的左葉子節點或者右葉子節點要經歷3個黑節點,很顯然也不滿足紅黑樹,因此還需要進行下一步操作,需要進行右旋操作

      右旋:與左旋正好相反

            

      由於是從13節點出現的不平衡,因此對13節點進行右旋,得到結果

            

      而後再對其節點進行變色,得到結果

            

這便是紅黑樹的一個變換,它主要用途有很多,例如java中的TreeMap以及JDK1.8以後的HashMap在當個節點中鏈表長度大於8時都會用到。

總結:

1. 當出現新的節點時默認爲紅色插入,如果其父節點爲紅色,則對其遞歸向上換色,如果根節點由此變爲紅色,則對根節點進行左旋(右側過深)或右旋(左側過深),之後從根節點向下修改顏色

2. 從根節點檢查紅色節點是否符合路徑上的黑色節點數量一致(即根節點到所有NIL經過黑色節點數量是否一致),不一致,對該節點進行左旋(右側黑色節點數量更多)或右旋(左側黑色節點數量更多),並變換顏色,重複2操作直到符合紅黑樹規則

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