在此之前,我沒有了解過紅黑樹以及AVL tree,真是孤陋寡聞。如果你也在學習的話,我們一起進步。
如果,你很急,那么只看紅色加粗即可。
1.紅黑樹(RB-tree)
紅黑樹是一種特殊的二叉搜索樹,特殊在它的性質。它是SGI STL(gcc編譯器使用)唯一實現的搜尋樹,作為關聯式容器(至少有set, map, multiset)的底部機制之用。
性質:
- 節點非黑即紅。
- 根節點是黑色。
- 樹尾端NULL節點,是黑色。
- 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
- 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
===》
從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長
(新增節點必須為紅,新增節點父節點必須為黑)
為什么呢?
注意到性質4導致了路徑不能有兩個毗連的紅色節點。最短的可能路徑都是黑色節點,最長的可能路徑有交替的紅色和黑色節點。因為根據性質5所有最長的路徑都有相同數目的黑色節點,這就表明了沒有路徑能多於任何其他路徑的兩倍長。===》
此樹大致上平衡的。
它適合什么?
查找 插入 刪除 較多的情況(搜尋效率幾乎和AVL-tree樹相等)
RB-tree節點結構
1 struct __rb_tree_node_base 2 { 3 color_type color;//節點顏色 4 base_ptr parent;//父節點 5 base_ptr left;//左節點 6 base_ptr right;//右節點 7 ... 8 }
2.AVL 樹(平衡二叉搜索樹)
平衡二叉樹要求很嚴格,它限定
左右子樹的高度差(絕對值)不超過1,所以他的
高度會低於紅黑樹,我們知道,二叉樹的查找復雜度與其高度密切相關(O(log
2n)),所以我們就知道了:二叉平衡樹
適合查找。礙於它的嚴格限制,必須要時刻保證左右子樹高度差,所以在進行
插入刪除操作時,旋轉子樹(但旋轉、雙旋轉)就變得很麻煩。
它適合什么?
查找 較多的情況
其實作為二叉搜索樹的AVL和RB-tree,查找速度相當O(logn),在插入和刪除上,都要進行旋轉,紅黑樹還要進行紅黑變色,統計性能紅黑樹要優於AVL,這也是GUN C++ 的SGI STL采用RB-tree作為map、set底層實現的主要原因。
上面說的太淺,我的另一篇較為詳細梳理紅黑樹STL源碼的文章 https://www.cnblogs.com/yocichen/p/10913883.html,希望對你有幫助。
