數據結構之紅黑樹

數據結構之紅黑樹


紅黑樹介紹:
紅黑樹是一個平衡的二叉樹,但不是一個完美的平衡二叉樹。雖然我們希望一個所有查找都能在~lgN次比較內結束,但是這樣在動態插入中保持樹的完美平衡代價太高,所以,我們稍微放鬆逛一下限制,希望找到一個能在對數時間內完成查找的數據結構。這個時候,紅黑樹站了出來。

1:紅黑樹性質
先上圖
數據結構之紅黑樹
性質一:所有節點要麼是紅色要麼是黑色。這裏只是對節點進行區分,也就是說節點只有2種狀態
性質二:根節點必須是黑色。
性質三:所有葉子節點(NIL或者空節點)必須爲黑色。
性質四:紅節點的2個子節點必須都爲黑色。這裏是杜絕出現連續的紅節點
性質五:從任一節點到其它每個葉節點的所有路徑都包含相同數目的黑色節點。
只有滿足以上5個性質的二叉樹纔是紅黑樹。

2:紅黑樹預備知識
紅黑樹是一棵特殊的樹二叉搜索樹,正常情況下,二叉樹的插入,查找的時間複雜度都是O(logn),但是在極端情況下,二叉搜索樹會退化成鏈表,導致插入,查找的複雜度回達到O(logn),理想情況下,是實現一棵完全平衡樹,但是因爲調整一棵二叉樹成爲一棵完全平衡樹,代價太大,得不償失。因此紅黑樹作爲一種權衡替代了完全平衡樹。紅黑樹插入操作和二叉搜索樹無異,不同在於插入之後怎麼調整使其成爲一棵紅黑樹,即滿足上文提及的5條紅黑樹性質。

3:紅黑樹基本操作

改變顏色:黑 -> 紅 紅-> 黑

左旋:

數據結構之紅黑樹

右旋:

數據結構之紅黑樹

4:紅黑樹調整操作

假設插入節點是N,插入節點父親節點是P,祖父節點是G,叔父節點是S

情形一:插入節點是根節點,則根據性質二,直接將插入節點置爲黑色

情形二:如果插入節點父節點是黑色,則因爲插入節點默認是紅色。所以不需要做任何操作,即可滿足紅黑樹平衡條件,之所以插入節點默認是紅色,因爲如果插入節點是黑色,則直接違背性質五,基本上所有的子樹都需要做調整,代價太大。

情形三::如果插入節點是紅色,父親節點是紅色,叔父節點也是紅色,這種情形下,祖父節點肯定是黑色,先把祖父節點變爲紅色,父親節點,叔父節點變爲黑色,這樣即不會違背性質四,又同時協調了規則五,因爲所有經過節點P,S 的支路要麼以P,S爲根節點,要麼必須經過G;但是祖父節點顏色改變了,所以需要對祖父節點進行插入節點調整操作,這是一個迭代的過程。

情形四:如果插入節點N是紅色,父親節點是紅色,叔父節點是黑色,父親節點P是祖父節點的左孩子;這種情形下,祖父節點G一定是黑色節點。如果插入節點N是父親節點P的右孩子,需要先以父親節點P爲中心進行左旋,然後以祖父節點G爲中心進行右旋。這個時候,因爲新祖父節點和新祖父節點的左孩子都是紅色,新祖父節點的右孩子是黑色,只需要新祖父節點置爲黑色,新祖父節點的右孩子置爲紅色,即可滿足紅黑樹條件。

情形五:如果插入節點N是紅色,父親節點是紅色,叔父節點是黑色,父親節點P是祖父節點的右孩子;這種情形下,祖父節點G一定是黑色節點。如果插入節點N是父親節點P的左孩子,需要先以父親節點P爲中心進行右旋,然後以祖父節點G爲中心進行左旋。這個時候,因爲新祖父節點和新祖父節點的左孩子都是紅色,新祖父節點的右孩子是黑色,只需要新祖父節點置爲黑色,新祖父節點的右孩子置爲紅色,即可滿足紅黑樹條件。

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