紅黑樹和AVL樹


在此之前,我沒有了解過紅黑樹以及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,希望對你有幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM