概述
紅黑樹是一棵二叉搜索樹, 主要用在更改比查詢更加頻繁的地方(而二叉平衡樹用在搜索比更改頻繁的地方).
已經的一些性質:
- 二叉搜索樹上基本操作所花費的時間與這棵樹的高度成正比.
- 對於一棵完全二叉樹, 這些操作的的最壞運行時間爲O(lgn), 如果搜索二叉樹退化爲線性表, 則其最壞的運行時間是O(n).
退化爲線性表的搜索二叉樹, 其操作時間爲O(n):
圖(1)
一棵完全二叉樹的操作時間是O(lgn):
圖(2)
搜索二叉樹,平衡搜索二叉樹,紅黑樹的區別與聯繫
樹種類 | 是否完全二叉樹 | 是否自動平衡 | 查找性能 | 插入(刪除)性能 |
---|---|---|---|---|
搜索二叉樹(BST) | 否 | 否 | 不確定, 如果比較平衡, 則接近於O(lgn), 如果不平衡, 則接近O(N) | 好 |
平衡二叉樹(AVL) | 是 | 是 | 很好 | 不太好 |
紅黑樹 | 否 | 是, 但是不會嚴格平衡 | 好 | 好 |
紅黑樹
二叉搜索樹
二叉搜索樹主要有如下性質:
- 二叉樹:
扇出(fanout)
爲2, 只有2個分叉. - 搜索性: 比如對於父節點x, 其左邊子節y點一定小於父節點, 其右邊子節點z一定大於父節點.
性質
紅黑樹是在滿足二叉搜索樹
的基礎上, 再滿足如下性質:
- 每個節點要麼是紅色的, 要麼是黑色的.
- 根結點是黑色的.
- 每個葉子節點是黑色的.
- 如果一個節點是紅色的, 則它的兩個子節點是黑色的.
- 對於每個節點, 從該節點到其所有的後代葉子節點的簡單路徑上, 均包含相同數目的黑色節點.
注意: 紅黑樹中, 所有子節點都是空節點, 而用戶插入的節點永遠不是子節點.
圖(3) 一棵顯示有子節點的紅黑樹
旋轉
旋轉是不改變搜索二叉樹的搜索性質的. 即是旋轉之後, 對於任意節點X, 其左子節點Y的值小於父節點X的值, 節點X的右子節點Z的值一定大於等於其父節點X的值.
旋轉的目的是改變樹的高度, 增加樹的操作性能.
我們可以得知如下信息:
- 旋轉是發生在
搜索二叉樹
父節點和子節點之間的. - 旋轉之後搜索二叉樹還是具有搜索性質.
- 旋轉一般用作降低二叉樹的高度, 提高在樹上的集合操作的性能.
- 旋轉是以父子兩個節點的鏈接線爲
支軸
的.
參考
- <<算法導論>>第12章, 13章