讓你徹底瞭解紅黑樹

當面試官問你什麼是紅黑樹?紅黑樹的的特性和優勢是什麼?,在什麼情況下需要變色,什麼情況下需要旋轉?

小夥伴們不要懵,我來慢慢的揭開紅黑樹的神祕面紗。

想要理解紅黑樹,就要理解什麼是二叉查找樹(Binary Search Tree)?

二叉查找樹(BST)的特徵——(簡稱左小右大)

1)左子樹上所有的節點的值均小於或等於它的根節點的值。
2)右子樹上所有的節點的值均大於或等於它的根節點的值。
3)左右子樹也分別爲二叉排序樹

下圖中的這棵樹就是一顆經典的二叉查找樹
在這裏插入圖片描述
1)如果想查找10,則先與根節點比較,10>9,所以10會出現在根節點的右子樹中,再查看右節點13。

在這裏插入圖片描述
根據左小右大原則,以此類推
在這裏插入圖片描述
結論:查找所需的最大次數等同於二叉查找樹的高度。

但是在插入數據時二叉查找樹有一個缺陷,那就是會出現左右不平衡的現象,
例如:初始的二叉樹有三個節點,如下圖所示
在這裏插入圖片描述
此時依次插入以下五個結點:7,6,5,4,3,根據二叉查找樹的特性,但是會變成這個樣子。
在這裏插入圖片描述呃呃!!有點太醜了

爲了解決這一不平衡問題,紅黑樹就應運而生了。

紅黑樹是一種自平衡的二叉查找樹。除了符合二叉查找樹的基本特性之外,還具備其他的特性,滿足以下五個規則:

規則1.結點是紅色或黑色。

規則2.根結點是黑色。

規則3.每個葉子結點都是黑色的空結點(NIL結點)。

規則4.每個紅色結點的兩個子結點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色結點)

規則5.從任一結點到其每個葉子的所有路徑都包含相同數目的黑色結點。

下面展示的是一個典型的紅黑樹
在這裏插入圖片描述
紅黑樹從根到葉子的最長路徑不會超過最短路徑的2倍。

當插入或刪除結點的時候,紅黑樹的規則有可能被打破,所以需要做一些調整,這樣才能繼續維持平衡。

那麼,什麼情況下會破壞紅黑樹的規則,什麼情況下不會破壞規則呢?我們舉兩個的例子:

  1. 向原紅黑樹中插入值爲14的新結點:
    在這裏插入圖片描述
    由於父節點15是黑色結點,因此這種情況並不會破壞紅黑樹的規則,無需做任何調整。

  2. 當插入節點21時,由於父結點22是紅色結點,因此這種情況打破了紅黑樹的規則4,則需要做調整。
    在這裏插入圖片描述
    調整的方法有兩種:變色和旋轉,旋轉又包括左旋轉和右旋轉。

  3. 變色:爲了重新符合紅黑樹的規則,嘗試把紅色結點變爲黑色,或者把黑色結點變爲紅色。
    2.旋轉

    2.1左旋轉:

    逆時針旋轉紅黑樹的兩個結點,使得父結點被自己的右孩子取代,而自己成爲自己的左孩子。
    看下圖:
    

    在這裏插入圖片描述
    圖中,身爲右孩子的Y取代了X的位置,而X變成了自己的左孩子。此爲左旋轉。

右旋轉:順時針旋轉紅黑樹的兩個結點,使得父結點被自己的左孩子取代,而自己成爲自己的右孩子。大家看下圖:
在這裏插入圖片描述
圖中,身爲左孩子的Y取代了X的位置,而X變成了自己的右孩子。此爲右旋轉。

在紅黑樹插入新結點的時候,可以分爲5種不同的情況,每一種情況有不同的調整方法,
情況1:新結點(A)位於樹根,沒有父結點。
這種情況,直接讓新結點變色爲黑色,規則2得到滿足。同時,黑色的根結點使得每條路徑上的黑色結點數目都增加了1,所以並沒有打破規則5。
在這裏插入圖片描述
情況2:新結點(B)的父結點是黑色
這種局面,新插入的紅色結點B並沒有打破紅黑樹的規則,所以不需要做任何調整
在這裏插入圖片描述
情況3:新結點(D)的父結點和叔叔結點都是紅色。
在這裏插入圖片描述
這種情況,兩個紅色結點B和D連續,違反了規則4。因此我們先讓結點B變爲黑色:
在這裏插入圖片描述
這樣一來,結點B所在路徑憑空多了一個黑色結點,打破了規則5。因此我們讓結點A變爲紅色:
在這裏插入圖片描述
這時候,結點A和C又成爲了連續的紅色結點,我們再讓結點C變爲黑色:
在這裏插入圖片描述
經過上面的調整,這重新符合了紅黑樹的規則。
情況4:新結點(D)的父結點是紅色,叔叔結點是黑色或者沒有叔叔,且新結點是父結點的右孩子,父結點(B)是祖父結點的左孩子。
在這裏插入圖片描述
我們以結點B爲軸,做一次左旋轉,使得新結點D成爲父結點,原來的父結點B成爲D的左孩子:
在這裏插入圖片描述
局面5:新結點(D)的父結點是紅色,叔叔結點是黑色或者沒有叔叔,且新結點是父結點的左孩子,父結點(B)是祖父結點的左孩子。
在這裏插入圖片描述
我們以結點A爲軸,做一次右旋轉,使得結點B成爲祖父結點,結點A成爲結點B的右孩子:
在這裏插入圖片描述
接下來,我們讓結點B變爲黑色,結點A變爲紅色:
在這裏插入圖片描述
經過上面的調整,這重新符合了紅黑樹的規則。

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