一、AVL樹(平衡二叉樹)
(1)簡介
AVL樹是帶有平衡條件的二叉查找樹,一般是用平衡因子差值判斷是否平衡並通過旋轉來實現平衡,左右子樹高度差不超過1,和紅黑樹相比,AVL樹是嚴格的平衡二叉樹,平衡條件必須滿足(所有結點的左右子樹高度差不超過1)。不管我們是執行插入還是刪除操作,只要不滿足上面的條件,就要通過旋轉來保存平衡,而因為旋轉非常耗時,由此我們可以知道AVL樹適合用於插入與刪除次數比較少,但查找多的情況。
(2)局限性
由於維護這種高度平衡所付出的代價比從中獲得的效率收益還大,故而實際的應用不多,更多的地方是用追求局部而不是非常嚴格整體平衡的紅黑樹。當然,如果應用場景中對插入刪除不頻繁,只是對查找要求較高,那么AVL還是較優於紅黑樹。
(3)應用
1.Windows NI內核中廣泛存在;
二、紅黑樹
(1)簡介
一種二叉查找樹,但在每個節點增加一個存儲位表示結點的顏色,可以是紅或黑(非紅即黑)。通過對任何一條從根到葉子的路徑上各個節點着色的方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出兩倍,因此,紅黑樹是一中弱平衡二叉樹(由於是弱平衡,可以看到,在相同的節點情況下,AVL樹的高度低於紅黑樹),相對於要求嚴格的AVL樹來說,它的旋轉次數少,插入最多兩次旋轉,刪除最多三次旋轉,所以對於搜索,插入,刪除操作較多的情況下,我們就用紅黑樹。
(2)性質
(1)結點非紅即黑
(2)根結點是黑色的
(3)每個葉子節點(NULL節點)是黑色的
(4)每個紅色節點的兩個子節點都是黑色的。(不能有兩連續的紅色節點)
(5)從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
注意:性質(5)保證紅黑樹的最長路徑不超過最短路徑的兩倍。
(3)應用
1、廣泛應用於C++的STL中,map和set底層都是用紅黑樹實現的。