定義
說到紅黑樹(r-b tree),首先要知道它是一顆二叉查詢樹(二叉查詢樹(binary search tree),又稱二叉排序樹(binary sort tree),亦稱二叉搜尋樹,下文統稱為二叉查詢樹),其次才作為一顆紅黑樹。所以它不僅要滿足二叉查詢樹的規則,而且要滿足紅黑樹的規則。如下:
- 二叉查詢樹
- 規則一:若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
- 規則二:若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
- 規則三:左、右子樹也分別為二叉查詢樹;
- 紅黑樹
- 規則一:每個節點或者是黑色,或者是紅色;
- 規則二:根節點是黑色;
- 規則三:每個葉子節點(nil)是黑色; -(注意:這裡葉子節點,是指為空(nil或null)的葉子節點)==
- 規則四:如果乙個節點是紅色的,則它的子節點必須是黑色的;==(注意:此規則表明紅黑樹中不可能有連續的兩個紅色節點,但可以有連續的兩個甚至大於兩個的黑色節點,且黑色節點的兩個子節點可以是不同顏色的)==
- 規則五:從乙個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點;==(注意:此規則確保沒有一條路徑會比其他路徑長出倆倍。因而,紅黑樹是相對接近平衡的二叉樹)==
所以一顆標準的紅黑樹是要滿足以上七個規則的!(下文所說的規則除非特別指明為二叉查詢樹規則,否則統指的是紅黑樹的五個規則)
應用場景
為什麼選擇紅黑樹
既然我們已經有了二叉查詢樹了,為什麼還要弄出乙個特殊的二叉查詢樹紅黑樹呢?原因是二叉查詢樹存在一定的缺陷,主要體現在插入方面,例如我們現有二叉查詢樹如下:
接下來我們依次插入如下五個節點:7,6,5,4,3。依照二叉查詢樹的特性,結果會變成什麼樣呢?
雖然形態符合二叉查詢樹的規則,但幾乎變成了線性,查詢效率大大降低!由此紅黑樹應運而生。
紅黑樹的時間複雜度
紅黑樹的時間複雜度為o(lgn)
引例:一棵有n個內節點的紅黑樹高度至多為2lg(n+1);參考證明:先證明某一節點x為根的子樹中至少包含2^(bh(x)) - 1個內節點(歸納假設);
如果:x高度為0,則x必為葉子節點,這時以x為根的子樹至少包含2^(bh(x)) - 1 = 2^0 - 1= 0,
考慮x為正數,並且x有兩個孩子,兩個孩子的高度為bh(x)或bh(x)-1(根據孩子自身的紅黑性質決定),所以假設每個孩子至少包含2^(bh(x)-1) - 1個內節點,則x = 2*(2^(bh(x)-1) - 1) + 1(x本身),則x = 2^(bh(x)) - 1,
得證根據規則四(如果乙個節點為紅,則其孩子必為黑)可知,高度為h的樹的黑高度至少為h/2
所以 n >= 2^(h/2) - 1,所以lg(n+1) <= h/2,所以可知乙個有n個內節點的紅黑樹高度至多為2lg(n+1),
得證紅黑樹的查詢長度最多不超過2lg(n+1),因此其查詢時間複雜度是o(lg n)
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹筆記 紅黑樹的插入操作
紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...