紅黑樹,red-black tree 「rbt」是乙個自平衡(不是絕對的平衡)的二叉查詢樹(bst),樹上的每個結點都遵循下面的規則:
1.結點是紅色或黑色;
2.根節點和葉子結點(nil節點)是黑色;
3.每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點);
4.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點;
5.根節點必黑,新增是紅色,只能黑連黑,不能紅連紅; 爸叔通紅就變色,爸紅叔黑就旋轉,哪邊黑往哪邊轉。(記憶重點)
在紅黑樹進行插入和刪除的操作後,可能會打破紅黑樹的四條性質。而變色和旋轉,能夠幫助我們維護紅黑樹的四條性質,保持紅黑樹的平衡。
假設新插入的結點為 x
1.將新插入的結點 x 標記為紅色;
2.如果結點 x 是根節點(root),則標記為黑色;
3.如果結點 x 的 parent 結點是紅色,且結點 x 不是根節點(root):
3.1 如果 x 的 uncle (叔叔,parent結點的兄弟結點) 是紅色:
3.1.1 將 parent 和 uncle 標記為黑色
3.1.2 將 grand parent (祖父) 標記為紅色
3.1.3 讓 x 節點的顏色與 x 祖父的顏色相同,然後重複步驟 2、3
例子:
套用上面的公式:
將新插入的 x 結點標記為紅色
發現 x 結點的 parent 和 uncle 結點都為紅色
將 parent 和 uncle 結點變為黑色;
將 x 和 x 的祖父結點 g 標記為相同顏色,即紅色;
若此時發現結點 g 為根節點,則標記根節點 g 為黑色;若此時結點 g 不為根節點,則此時讓結點 x 等於 結點 g ,繼續往上調整(如下圖所示進行向上調整);
結束。
3.2 如果 x 的 uncle (叔叔,parent結點的兄弟結點) 是黑色,分四種情況處理:
3.2.1 ll平衡旋轉(p 是 g 的左孩子,並且 x 是 p 的左孩子)
3.2.2 rr平衡旋轉(p 是 g 的右孩子,並且 x 是 p 的右孩子)
3.2.3 lr平衡旋轉(p 是 g 的左孩子,並且 x 是 p 的右孩子)
3.2.4 rl平衡旋轉(p 是 g 的右孩子,並且 x 是 p 的左孩子)
(如果對旋轉操作有疑惑,可以看平衡二叉樹的旋轉操作)
紅黑樹簡單認識
紅黑樹首先是一種樹形結構,同時又是乙個二叉樹 每個節點最多只能有兩個孩子節點,左節點小於等於父節點,右節點大於父節點 為了保證樹的左右孩子樹相對平衡 深度相同 紅黑樹使用了節點標色的方式,將節點標記為紅色或者黑色,在計算樹的深度時只統計黑色節點的數量,不統計紅色節點數量,同時沒有變數高度,增加了父親...
紅黑樹(未完待續)
特點它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢 插入 刪除的時間複雜度最壞為o log n 1 每個結點要麼是紅的,要麼是黑的。2 根結點是黑的。3 每個葉結點 葉結點即指樹尾端nil指標或null結點 是黑的。4 如果乙個結點是紅的,那麼它的倆個兒子都是...
簡單理解紅黑樹
前言 在計算機領域,資料的處理能力是非常重要的,查詢作為一種對資料處理乙個很重要的能力,我們就先來看看今天要說的紅黑樹 查詢說到查詢我們很快就能想起來很多常用的查詢方式,比如說遍歷,二分查詢,雜湊等,其中我們知道雜湊在一定情況下可以達到o 1 的時間複雜度,速度可謂是非常之快,但是他也有他的缺點就是...