【數據結構】紅黑樹

1、什么是紅黑樹?

??????紅黑樹是一個要求不那么嚴格的平衡二叉樹搜索樹(平衡二叉搜索樹/AVL樹=平衡二叉樹+二叉搜索樹)
平衡二叉樹要求左右子樹高度差值<=1,紅黑樹放寬了這個要求,只要求任意路徑的長度只差不會超過2倍即可。更準確的說是任意路徑上的的黑色節點數相同即可

2、紅黑樹有什么用?

紅黑樹可用于數據查找,因為其“相對”平衡,所以其查找效率略低于平衡二叉搜索樹,但是也非常高效。

3、平衡二叉搜索樹的查找效率更高,為什么還要紅黑樹?

??????平衡二叉樹的要求過于嚴格(左右子樹高度差值<=1),導致幾乎每一次插入/刪除節點都會破壞平衡二叉樹的結構,需要將其重新調整為平衡二叉樹。
??????顯然,如果在那種插入、刪除很頻繁的場景中,平衡樹需要頻繁著進行調整,這會使平衡樹的性能大打折扣。而紅黑樹因為不是嚴格的平衡,所以可以避免這個問題,同時紅黑樹又是一個“相對”平衡的二叉搜索樹,所以其查找性能也很好。

3、紅黑樹的特點/性質(最好背下來)

1、每個節點都有顏色(紅或黑)
2、根節點是黑色的
3、葉節點時黑色的(注意:葉節點是空節點,有值的節點都不是葉結點)
4、沒有兩個相鄰的紅色節點(或者說紅色節點的子節點一定是黑色節點)
5、從根節點到葉結點的每條路徑包含的黑色節點相同(又叫:黑節點平衡)

4、從紅黑樹查找數據

與二叉搜索樹查找數據的過程一致

5、向紅黑樹中插入數據(插入的節點統一標記為紅色)

為什么標記位紅色?
答:每條路徑包含的黑色節點已經相同了,將新插入的節點標記位紅色,那么插入后每條路徑包含的黑色節點數沒變,所以依然相同

(若插入數據后破壞了紅黑樹的性質,則需要對紅黑樹進行“再平衡”,使其滿足紅黑樹的性質。并且新插入的節點最多只會破壞5條性質中的1條)
插入數據分為了3種情況
1、插入的節點,其沒有父節點
2、插入的節點,其父節點是黑色節點
3、插入的節點,其父節點是紅色節點

第一種情況:插入的節點沒有父節點,說明插入的節點是根節點,此時直接將節點的顏色改為黑色即可

第二種情況:插入的節點,其父節點是黑色節點,此時不需要采取措施。新插入的節點并沒有破壞紅黑樹的性質

插入節點14

第三種情況:插入的節點,其父節點是紅色節點。如圖

插入節點21

可以看到21和22同為紅色,破壞了“沒有兩個相鄰的紅色節點”性質,需要進行再平衡操作。

如何再平衡?(最好背下來)

分為以下情況(共同前提:插入節點的父節點是紅色):
1、插入節點的父節點的兄弟節點(即插入節點的叔叔節點,就是上圖中的27節點)是紅色
2、插入節點的父節點的兄弟節點是黑色

為什么要看其叔叔節點,而不是其父親節點?
答:這里其實跳步了,我們第一步還是調整其父親節點,但是其父親節點只有一種調整方法:由紅色變為黑色。第二步在看其叔叔節點的顏色。所以這里直接跳過其父親節點的調整,看其叔叔節點的顏色

第一步:將其父節點顏色變為黑色
因為其父節點顏色變成了黑色,所以包含其父節點的這條路徑多了一個黑色節點。破壞了“從根節點到葉結點的每條路徑包含的黑色節點相同”性質,如上面的13,17,25,22(變成了黑色),21路徑

第二步:看其叔叔的顏色:

第一種情況:其叔叔節點為紅色(其父節點為紅色的前提下)
步驟:
1、把叔叔節點變成黑色
2、把其祖父節點(父節點的父節點)變成紅色。若其祖父節點為根節點,則不變色
3、把祖父節點當做新插入的節點,重復1,2,3步驟直到其祖父節點為根節點

第二種情況:其叔叔節點為黑色(其父節點為紅色的前提下)
這種情況下又分為兩種情況:
1、新插入的子節點是父節點的左子節點
2、新插入的子節點是父節點的右子節點

第一種情況:新插入的子節點是父節點的左子節點(其叔叔節點為黑色,并且其父節點為紅色的前提下)
步驟:(先變色,在右旋)

image.png

1、將其父節點變為黑色
2、將其祖父節點變為紅色(其父節點是紅色,則其祖父節點必為黑色)
3、以其父節點為支點,進行右旋操作(如何右旋?百度上有很形象的動畫演示)

第二種情況:新插入的子節點是父節點的右子節點(其叔叔節點為黑色,并且其父節點為紅色的前提下)
步驟:(先左旋將其變為情況一,在按情況一的操作來進行

image.png

以新插入的節點為支點,進行左旋操作,變為情況一,此時將插入節點的父節點(上圖的P節點)當做新插入的節點來進行情況一步驟下的:變色,右旋操作

6、紅黑樹的刪除操作:

下面我們開始討論刪除操作(下面的葉子節點都是指非NULL的葉子節點):

A. 刪除的是葉子節點且該葉子節點是紅色的 ---> 無需修復,因為它不會破壞紅黑樹的5個特性

B. 刪除的是葉子節點且該葉子節點是黑色的 ---> 很明顯會破壞特性5,需要修復。

C. 刪除的節點(為了便于敘述我們將其稱為P)下面有一個子節點 S,對于這種情況我們通過 將P和S的值交換的方式,巧妙的將刪除P變為刪除S,S是葉子節點,這樣C這種情況就會轉 換為A, B這兩種情況:

C1: P為黑色,S為紅色 ---> 對應 A 這種情況

C2: P為黑色或紅色,S為黑色 --- > 對應 B 這種情況

**D. **刪除的節點有兩個子節點,對于這種情況,我們通過將P和它的后繼節點N的值交換的方 式,將刪除節點P轉換為刪除后繼節點N,而后繼節點只可能是以下兩種情況:

D1: N是葉子節點 --- > 對應情況 A 或 B

D2: N有一個子節點 ---- > 對應情況 C

所以通過上面的分析我們發現,紅黑樹節點刪除后的修復操作都可以轉換為 A 或 B這兩種情況,而A不需要修復,所以我們只需要研究B這種情況如何修復就行了。

下面我們討論如何修復B中情況:(若沒有兄弟節點,則其兄弟節點是null節點,根據紅黑樹的性質,null節點為黑色)

image
image
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.簡介 紅黑樹是一種自平衡二叉查找樹(不是平衡二叉樹,只不過紅黑樹近似于平衡的狀態),它相對于二叉查找樹性能會更...
    CODERLIHAO閱讀 499評論 0 0
  • 2-3樹 在了解紅黑樹之前,我們先來認識2-3樹,在算法(第4版)[https://book.douban.com...
    端碗吹水閱讀 286評論 0 1
  • 紅黑樹 紅黑樹(英語:Red–black tree)是一種自平衡二叉查找樹,典型的用途是實現關聯數組。它是復雜的,...
    劉暉閱讀 920評論 0 6
  • 最近和朋友聊TreeMap、HashMap、ConcurrentHashMap的底層原理時,都知道用到了紅黑樹,但...
    MrDTree閱讀 962評論 0 2
  • 這篇文章收錄在我的 Github 上 algorithms-tutorial,另外記錄了些算法題解,感興趣的可以看...
    Lindz閱讀 4,362評論 3 18