平衡樹和二叉樹的區別
一、平衡二叉樹(AVL樹)
1、概念
AVL
樹是帶有平衡條件的二叉查詢樹,一般是用平衡因子差值判斷是否平衡並通過旋轉來實現平衡,左右子樹樹高不超過1
,和紅黑樹相比,AVL
樹是嚴格的平衡二叉樹,平衡條件必須滿足(所有節點的左右子樹高度差不超過1
)。不管我們是執行插入還是刪除操作,只要不滿足上面的條件,就要通過旋轉來保持平衡
,而旋轉非常耗時的,由此我們可以知道AVL
樹適合用於插入與刪除次數比較少,但查詢多
的情況。
2、侷限性
由於維護這種高度平衡所付出的代價比從中獲得的效率收益還大,故而實際的應用不多,更多的地方是用追求區域性而不是非常嚴格整體平衡的紅黑樹。當然,如果應用場景中對插入刪除不頻繁,只是對查詢要求較高,那麼AVL
還是較優於紅黑樹。
3、應用
Windows NT
核心中廣泛存在。
二、紅黑樹
1、概念
一種二叉查詢樹,但在每個節點增加一個儲存位表示節點的顏色,可以是紅或黑(非紅即黑
)。通過對任何一條從根到葉子的路徑上各個節點著色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍,因此,紅黑樹是一種弱平衡二叉樹(由於是弱平衡,可以看到,在相同的節點情況下,AVL樹的高度低於紅黑樹
),相對於要求嚴格的AVL
樹來說,它的旋轉次數少
,所以對於搜尋,插入,刪除操作較多
的情況下,我們就用紅黑樹
。
2、性質
- 每個節點非紅即黑
- 根節點是黑的
- 每個葉節點(葉節點即樹尾端
NULL
指標或NULL
節點)都是黑的 - 如圖所示,如果一個節點是紅的,那麼它的兩兒子都是黑的
- 對於任意節點而言,其到葉子點樹
NULL
指標的每條路徑都包含相同數目的黑節點 - 每條路徑都包含相同的黑節點
3、應用
- 廣泛用於
C ++
的STL
中,地圖和集都是用紅黑樹實現的 - 著名的
Linux
的的程式排程完全公平排程程式,用紅黑樹管理程式控制塊,程式的虛擬記憶體區域都儲存在一顆紅黑樹上,每個虛擬地址區域都對應紅黑樹的一個節點,左指標指向相鄰的地址虛擬儲存區域,右指標指向相鄰的高地址虛擬地址空間 IO
多路複用的epoll
的的實現採用紅黑樹組織管理的的的sockfd
,以支援快速的增刪改查Nginx
的的的中用紅黑樹管理定時器,因為紅黑樹是有序的,可以很快的得到距離當前最小的定時器Java
的的的中TreeMap
中的實現
相關文章
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 平衡二叉樹,B樹,B+樹二叉樹
- 平衡二叉樹二叉樹
- 排序二叉樹和平衡二叉樹排序二叉樹
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 手擼二叉樹——AVL平衡二叉樹二叉樹
- 平衡二叉樹(AVL)二叉樹
- 平衡二叉樹(AVL樹),原來如此!!!二叉樹
- 平衡二叉查詢樹:紅黑樹
- 十三、Mysql之平衡二叉樹(AVL樹)MySql二叉樹
- 自動平衡二叉樹的構建-AVL樹二叉樹
- 110. 平衡二叉樹二叉樹
- Java實現紅黑樹(平衡二叉樹)Java二叉樹
- 二叉樹的深度、寬度遍歷及平衡樹二叉樹
- 二叉堆、BST 與平衡樹
- LeetCode-110-平衡二叉樹LeetCode二叉樹
- JZ-039-平衡二叉樹二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 程式碼隨想錄——二叉樹-12.平衡二叉樹二叉樹
- 夜刷:平衡二叉樹的基本操作二叉樹
- Java 樹結構實際應用 四(平衡二叉樹/AVL樹)Java二叉樹
- python實現非平衡二叉樹Python二叉樹
- 每日一練(28):平衡二叉樹二叉樹
- 資料結構-平衡二叉樹資料結構二叉樹
- 二叉平衡樹 python 列表 遞迴Python遞迴
- 如何判斷一棵樹是否是二叉平衡樹~
- 平衡樹
- Python 樹表查詢_千樹萬樹梨花開,忽如一夜春風來(二叉排序樹、平衡二叉樹)Python排序二叉樹
- [Python手撕]判斷平衡二叉樹Python二叉樹
- 學習筆記——二叉平衡樹(BST)筆記
- 手寫AVL平衡二叉搜尋樹
- 遞迴判斷是否二叉平衡樹遞迴
- 樹和二叉樹簡介二叉樹
- 這兩天寫的一個二叉平衡樹
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 相同二叉樹和鏡面二叉樹問題二叉樹
- B 樹和 B+樹的區別, 為什麼 MySQL 要使用 B+樹MySql