一. 紅黑樹在java8中主要運用於hashmap的hash沖突,treemap的實現上
二. 紅黑樹的由來:
2-3樹:
2-3樹是二叉查找樹的變種,樹中的2和3代表兩種節點,以下表示為2-節點和3-節點。
2-節點即普通節點:包含一個元素,兩條子鏈接。
3-節點則是擴充版,包含2個元素和三條鏈接:兩個元素A、B,左邊的鏈接指向小於A的節點,中間的鏈接指向介於A、B值之間的節點,右邊的鏈接指向大於B的節點。
(1).3-節點沒有父節點,即整棵樹就只有它一個三節點。此時,將3-節點擴充為一個4-節點,即包含三個元素的節點,然后將其分解,變成一棵二叉樹。
此時二叉樹依然保持平衡。
(2).3-節點有一個2-節點的父節點,此時的操作是,3-節點擴充為4-節點,然后分解4-節點,然后將分解后的新樹的父節點融入到2-節點的父節點中
(3).3-節點有一個3-節點的父節點,此時操作是:3-節點擴充為4-節點,然后分解4-節點,新樹父節點向上融合,上面的3-節點繼續擴充,融合,分解,新樹繼續向上融合,直到父節點為2-節點為止,如果向上到根節點都是3-節點,將根節點擴充為4-節點,然后分解為新樹,至此,整個樹增加一層,仍然保持平衡。
紅黑樹本質上就是一顆二叉平衡樹,因為普通二叉樹,在最壞的情況下會演變成一個線性查找,時間復雜度為O(n),但是平衡二叉樹會保證樹的平衡,數據穩定在o(logn)以內查詢完成,平衡樹有個缺點就是插入和刪除會破壞掉這個樹的平衡,由於這種特性,就由2-3樹去實現他的平衡,但是2-3樹的實現又不方便實現,就通過紅黑樹來實現。紅黑樹和2-3樹的關聯,首先,最台面上的問題,紅和黑的含義。紅黑樹中,所有的節點都是標准的2-節點,為了體現出3-節點,這里將3-節點的兩個元素用左斜紅色的鏈接連接起來,即連接了兩個2-節點來表示一個3-節點。這里紅色節點標記就代表指向其的鏈接是紅鏈接,黑色標記的節點就是普通的節點。所以才會有那樣一條定義,叫“從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點”,因為紅色節點是可以與其父節點合並為一個3-節點的,紅黑樹實現的其實是一個完美的黑色平衡,如果你將紅黑樹中所有的紅色鏈接放平,那么它所有的葉子節點到根節點的距離都是相同的。所以它並不是一個嚴格的平衡二叉樹,但是它的綜合性能已經很優秀了。
紅黑樹的幾個特點:
1.節點一定是黑色 or 紅色;
2.根節點一定是黑色;
3.葉子節點一定是黑色;
4.紅色節點的子節點一定是兩個黑色節點;
5.任一節點出發,到葉子節點的黑色節點個數都是相等的。
三.紅黑樹的操作:
1.旋轉
2.變色
參考資料:
紅黑樹的實現原理:https://www.cnblogs.com/hilow/p/3949188.html
模擬紅黑樹插入刪除過程:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html