AVL樹(http://baike.baidu.com/view/593144.htm?fr=aladdin),又稱(嚴格)高度平衡的二叉搜索樹。其他的平衡樹還有:紅黑樹、Treap、伸展樹、SBT。
注:使用 "nil 葉子"或"空(null)葉子",它不包含數據而只充當樹在此結束的指示。這些節點在繪圖中經常被省略,導致了這些樹好象同上述原則相矛盾,而實際上不是這樣。與此有關的結論是所有節點都有兩個子節點,盡管其中的一個或兩個可能是空葉子。
紅黑樹(http://baike.baidu.com/view/133754.htm?fr=aladdin),紅黑樹也是二叉查找樹,統計性能要好於平衡二叉樹。典型的用途是實現關聯數組。因此,紅黑樹在很多地方都有應用。在C++ STL中,很多部分(目前包括set,multiset, map, multimap)應用了紅黑樹的變體(SGI STL中的紅黑樹有一些變化,這些修改提供了更好的性能,以及對set操作的支持)。
紅黑樹的關鍵性質: 從根到葉子的最長的可能路徑不多於(<=)最短的可能路徑的兩倍長。結果是這個樹大致上是平衡的。因為操作比如插入、刪除和查找某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同於普通的二叉查找樹。
注:最短的可能路徑都是黑色節點,最長的可能路徑有交替的紅色和黑色節點。
紅黑樹與AVL樹的比較:
AVL是嚴格的平衡樹,因此在增加或者刪除節點的時候,根據不同情況,旋轉的次數比紅黑樹要多;
紅黑樹是用非嚴格的平衡來換取增刪節點時候旋轉次數的降低開銷;
所以簡單說,如果你的應用中,搜索的次數遠遠大於插入和刪除,那么選擇AVL樹,
如果搜索,插入刪除次數幾乎差不多,應選擇紅黑樹。即,有時僅為了排序(建立-遍歷-刪除),不查找或查找次數很少,R-B樹合算一些。
紅黑樹與AVL樹的調整平衡的實現機制不同,AVL靠平衡因子和旋轉,紅黑樹靠節點顏色以及一些約定再加上旋轉。因此,存在去掉顏色的紅黑樹后它不是AVL樹,比如左子樹都是黑的,右子樹都是紅黑相間的,這樣整個樹高度2n的時候,根節點的左右層數差可以到n。
紅黑樹能夠以O(log2 n) 的時間復雜度進行搜索、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的數據結構 能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高。當然,紅黑樹並不適應所有應用樹的領域。如果數據基本上是靜態的,那么讓他們待在他們能夠插入,並且不影響平衡的地方會具有更好的性能。如果數據完全是靜態的,例如,做一個哈希表,性能可能會更好一些。紅黑樹是犧牲了嚴格的高度平衡的優越條件為 代價紅黑樹能夠以O(log2 n)的時間復雜度進行搜索、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的數據結構 能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高.
AVL樹在順序插入和刪除時有20%左右的性能優勢,但隨機性能反而落后15%左右,現實應用當然一般都是隨機情況,所以紅黑樹得到了更廣泛的應用。