1. 程式人生 > >紅黑樹與平衡二叉樹區別?

紅黑樹與平衡二叉樹區別?

如果說平衡二叉樹是一個類的話,那麼紅黑樹就是該類的一個例項。
演算法的書我丟久了,一下子也找不到,我是憑記憶說的。紅黑樹的演算法比較麻煩,但它的思想很好,如果理解了它的思想也就理解它的演算法,我也只記得思想,具體演算法記不得了。我就在這說說思想吧。

紅黑樹有兩個重要性質:
1、紅節點的孩子節點不能是紅節點;
2、從根到前端節點的任意一條路徑上的黑節點數目一樣多。

這兩條性質確保該樹的高度為logN,所以是平衡樹。

紅黑樹是每個節點都帶顏色的樹,節點顏色或是紅色或是黑色,紅黑樹是一種查詢樹。紅黑樹有一個重要的性質,從根節點到葉子節點的最長的路徑不多於最短的路徑的長度的兩倍。對於紅黑樹,插入,刪除,查詢的複雜度都是O(log N)。



插入的節點總是設為紅節點,當其復節點為紅節點時,這就有破壞了性質1,就需要調整。將插入節點作為考察節點,考察其叔父,如果也是紅節點,則將其父親和叔父改為黑節點,而將其祖父改為紅節點,然後以其祖父為考察節點。如果其叔父是黑節點則做一旋轉變換可以搞定,沒有圖不太好說明,你可以自己考慮一下,總之它的思想是把“多出來”的紅色往上一層推去,確保下面層紅黑性質,最後推到根以後,如果依然違反性質1,則可以直接把根由紅改黑即可,就相當於把這“多出來”的紅色推到樹以外的節點去了。

刪除節點時先要找到頂替的節點,如果刪去的節點是黑色則破壞了性質2,也需要調整。調整的思想也同前面類似,把這個黑色賦予頂替節點,則頂替節點相當於有兩重黑色,然後將它的兩重黑色向上推,一直推到根,再從根推到外面去了。

平衡二叉樹的調整演算法幾乎所有資料結構的書都有呀,根據破壞平衡性的加入點,將插入操作分為了四種,分別是LL、LR、RR、RL。每種引起不平衡的插入位置,均有相應的調整演算法。

AVL樹又稱高度平衡的二叉搜尋樹,是1962年由兩位俄羅斯的數學家G.M.Adel'son-Vel,sky和E.M.Landis提出 的.引入二叉樹的目的是為了提高二叉樹的搜尋的效率,減少樹的平均搜尋長度.為此,就必須每向二叉樹插入 一個結點時調整樹的結構,使得二叉樹搜尋保持平衡,從而可能降低樹的高度,減少的平均樹的搜尋長度. 

AVL樹的定義:

 一棵AVL樹滿足以下的條件: 

1>它的左子樹和右子樹都是AVL樹 

2>左子樹和右子樹的高度差不能超過1 從條件1可能看出是個遞迴定義,如GNU一樣. 

性質: 

1>一棵n個結點的AVL樹的其高度保持在0(log2(n)),不會超過3/2log2(n+1) 

2>一棵n個結點的AVL樹的平均搜尋長度保持在0(log2(n)). 

3>一棵n個結點的AVL樹刪除一個結點做平衡化旋轉所需要的時間為0(log2(n)).


# 紅黑樹是一種很有意思的平衡檢索樹。它的統計效能要好於平衡二叉樹(有些書籍根據作者姓名,Adelson- Velskii和Landis,將其稱為AVL-樹),因此,紅黑樹在很多地方都有應用。在C++ STL中,很多部分(目前包括 set, multiset, map, multimap)應用了紅黑樹的變體(SGI STL中的紅黑樹有一些變化,這些修改提供了更好的效能,以及對set操作的支援)。  
#   
# 紅黑樹的定義如下:  
#   
#   
# 滿足下列條件的二叉搜尋樹是紅黑樹  
#   
#     * 每個結點要麼是“紅色”,要麼是“黑色”(後面將說明)  
#     * 所有的葉結點都是空結點,並且是“黑色”的  
#     * 如果一個結點是“紅色”的,那麼它的兩個子結點都是“黑色”的  
#     * (注:也就是說,如果結點是黑色的,那麼它的子節點可以是紅色或者是黑色的)。  
#     * 結點到其子孫結點的每條簡單路徑都包含相同數目的“黑色”結點  
#     * 根結點永遠是“黑色”的  

AVL 樹是高度平衡的,頻繁的插入和刪除,會引起頻繁的reblance,導致效率下降
紅黑樹不是高度平衡的,算是一種折中,插入最多兩次旋轉,刪除最多三次旋轉