1. 程式人生 > >平衡二叉樹(AVL)與紅黑樹

平衡二叉樹(AVL)與紅黑樹

數組 條件 節點 avl樹 平衡因子 src 特性 復雜度 關聯數組

一、AVL樹性質

1.本身首先是一棵二叉搜索樹。

2.帶有平衡條件:每個結點的左右子樹的高度之差的絕對值(平衡因子)最多為1。

也就是說,AVL樹,本質上是帶了平衡功能的二叉查找樹(二叉排序樹,二叉搜索樹)。

技術分享圖片AVL樹的查找、插入和刪除在平均和最壞情況下都是O(logn)。
如果在AVL樹中插入或刪除節點後,使得高度之差大於1。此時,AVL樹的平衡狀態就被破壞,它就不再是一棵二叉樹;為了讓它重新維持在一個平衡狀態,就需要對其進行旋轉處理。


二、紅黑樹性質

紅黑樹是每個節點都帶有顏色屬性的二叉查找樹,顏色或紅色或黑色。在二叉查找樹強制一般要求以外,對於任何有效的紅黑樹我們增加了如下的額外要求:

1. 節點是紅色或黑色。

2. 根節點是黑色。

3 每個葉節點(NIL節點,空節點)是黑色的。

4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

5. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

技術分享圖片

紅黑樹的應用比較廣泛,主要是用它來存儲有序的數據,它的時間復雜度是O(logn),效率非常之高。
例如,Java集合中的
TreeSetTreeMap,C++ STL中的set、map,以及Linux虛擬內存的管理,都是通過紅黑樹去實現的。


三、兩者的區別

1、紅黑樹並不追求“完全平衡”——它只要求部分地達到平衡要求,降低了對旋轉的要求,從而提高了性能。紅黑樹能夠以O(log2 n) 的時間復雜度進行搜索、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的數據結構 能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高。當然,紅黑樹並不適應所有應用樹的領域。如果數據基本上是靜態的,那麽讓他們待在他們能夠插入,並且不影響平衡的地方會具有更好的性能。如果數據完全是靜態的,例如,做一個哈希表,性能可能會更好一些。在實際的系統中,例如,需要使用動態規則的防火墻系統,使用紅黑樹而不是散列表被實踐證明具有更好的伸縮性,典型的用途是實現關聯數組。


2、AVL樹是最先發明的自平衡二叉查 找樹。在AVL樹中任何節點的兩個兒子子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查找、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。

兩者的差異均由兩者本身的特性導致,正所謂“成也蕭何,敗也蕭何”。


參考內容:

https://baike.baidu.com/item/AVL%E6%A0%91/10986648?fr=aladdin

https://baike.baidu.com/item/%E7%BA%A2%E9%BB%91%E6%A0%91/2413209?fr=aladdin

http://blog.csdn.net/klarclm/article/details/7780319



平衡二叉樹(AVL)與紅黑樹