紅黑樹和AVL樹的區別(轉)


add by zhj: AVL樹和紅黑樹都是平衡二叉樹,雖然AVL樹是最早發明的平衡二叉樹,但直接把平衡二叉樹等價於AVL樹,我認為非常不合適。

但很多地方都在這么用。兩者的比較如下

平衡二叉樹類型 平衡度 調整頻率 適用場景
AVL樹 查詢多,增/刪少
紅黑樹 增/刪頻繁

 

 

原文:https://blog.csdn.net/u010899985/article/details/80981053

一,AVL樹

(1)簡介

一般用平衡因子判斷是否平衡並通過旋轉來實現平衡,左右子樹樹高不超過1,和紅黑樹相比,AVL樹是高度平衡的二叉樹,平衡條件必須滿足(所有節點的左右子樹高度差不超過1)。不管我們是執行插入還是刪除操作,只要不滿足上面的條件,就要通過旋轉來保持平衡,而的由於旋轉比較耗時,由此我們可以知道AVL樹適合用於插入與刪除次數比較少,但查找多的情況

(2)局限性

由於維護這種高度平衡所付出的代價比從中獲得的效率收益還大,故而實際的應用不多,更多的地方是用追求局部而不是非常嚴格整體平衡的紅黑樹。當然,如果應用場景中對插入刪除不頻繁,只是對查找要求較高,那么AVL還是較優於紅黑樹。

(3)應用

1,Windows NT內核中廣泛存在;

 

二、紅黑樹

(1)簡介

也是一種平衡二叉樹,但每個節點有一個存儲位表示節點的顏色,可以是紅或黑。通過對任何一條從根到葉子的路徑上各個節點着色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍,因此,紅黑樹是一種弱平衡二叉樹(由於是弱平衡,可以看到,在相同的節點情況下,AVL樹的高度<=紅黑樹),相對於要求嚴格的AVL樹來說,它的旋轉次數少,所以對於搜索,插入,刪除操作較多的情況下,用紅黑樹。

(2)性質

                 如圖1所示,每個節點非紅即黑;

1. 每個節點非紅即黑
2. 根節點是黑的;
3. 每個葉節點(葉節點即樹尾端NULL指針或NULL節點)都是黑的;
4. 如圖所示,如果一個節點是紅的,那么它的兩兒子都是黑的;
5. 對於任意節點而言,其到葉子點樹NULL指針的每條路徑都包含相同數目的黑節點;
6. 每條路徑都包含相同的黑節點;

(3)應用

1. 廣泛用於C ++的STL中,地圖是用紅黑樹實現的;
2. Linux的的進程調度,用紅黑樹管理進程控制塊,進程的虛擬內存空間都存儲在一顆紅黑樹上,每個虛擬內存空間都對應紅黑樹的一個節點,左指針指向相鄰的虛擬內存空間,右指針指向相鄰的高地址虛擬內存空間;
3. IO多路復用的epoll采用紅黑樹組織管理sockfd,以支持快速的增刪改查;
4. Nginx中用紅黑樹管理定時器,因為紅黑樹是有序的,可以很快的得到距離當前最小的定時器;
5. Java的TreeMap的實現;

 


免責聲明!

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



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