演算法導論裡是這樣定義一棵紅黑樹的:
1、每個結點或是紅色的,或是黑色的
2、根節點是黑色的
3、每個葉結點(nil)是黑色的
4、如果乙個節點是紅色的,則它的兩個兒子都是黑色的。
5、對於每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑色結點。
紅黑樹是乙個平衡的二叉樹,但不是乙個完美的平衡二叉樹。雖然我們希望乙個所有查詢都能在~lgn次比較內結束,但是這樣在動態插入中保持樹的完美平衡代價太高,所以,我們稍微放鬆逛一下限制,希望找到乙個能在對數時間內完成查詢的資料結構。
紅黑樹是在普通二叉樹上,對沒個節點新增乙個顏色屬性形成的,同時整個紅黑二叉樹需要同時滿足一下五條性質
上圖引理:一棵有n個內結點的紅黑樹的高度至多為2lg(n+1)
對以x為根的子樹,它所包含的內部結點數至少為2^[bh(x)]-1。這裡bh(x)(bh嘛,black height)被定義為結點x的黑高度,就是說,從結點x(不包括它本身)到它任乙個葉結點的路徑上所有黑色結點的個數。
(1)若x高度為0,那麼它就是一葉子結點,它確實至少包含2^0-1=0個內部結點
(2)假設x為紅黑樹的某一內部結點,且它高度h>0,那麼它的黑高度就是bh(x),但是它的兩個孩子結點呢?這個就根據它們的顏色來判斷了: 如果x有乙個紅色的孩子y,那麼y的黑高度bh(y)=bh(x),看看上面對黑高度的定義你就明白了——既然它是紅色的,那麼它的黑高度就應該和它父親的黑高度是一樣的;
如果x有乙個黑色的孩子z,那麼z的黑高度bh(z)=bh(x)-1,這個怎麼解釋呢,因為它自己就是個黑結點,那麼在計算它的黑高度時,必須把它自己排除在外(還是根據定義),所以它是bh(x)-1。
(3)x的孩子結點所構成的子樹的高度肯定小於x這顆子樹,那麼對於這兩個孩子,不管它們顏色如何,一定滿足歸納假設的是至少hb 高度為bh(x)-1。所以,對x來說,它所包含的內部結點個數「至少」為兩個孩子結點所包含的內部結點數,再加上它自己,於是就為2^[bh(x)-1]-1+2^[bh(x)-1]-1+1=2^[bh(x)]-1,歸納證明完畢。
也就是說n>=2^[bh(x)]-1---------①
把一 中紅黑樹性質中(4)、(5)兩個特性結合起來,其實我們可以得到黑節點至少是紅節點的2倍。用一句話來說就是「有紅必有黑,但有黑未必一定有紅」。為什麼這麼說呢,因為從特性(4)我們知道,如果有乙個紅結點存在,那麼它的兒子結點一定是黑的,最極端的情況下,該路徑上所有的結點就被紅、黑兩種結點給平分了那就是黑節點至少是紅節點的2倍。不知這個問題我解釋清楚沒有,因為這是往下理解的關鍵。
如果一棵紅黑樹的高為h,那麼在這個高度上(不包括根結點本身)至少有1/2h的黑結點,再結合上面對「黑高度」的定義,我們說,紅黑樹根結點的黑高度至少是1/2h,好了,我們拿出公式①,設n為該紅黑樹所包含的內部結點數,我們得出如下結論: n>=2^(1/2h)-1。 我們把它整理整理,就得到了h<=2lg(n+1),就是我們要證明的結論:紅黑樹的高度最多也就是2lg(n+1)。
"一棵含有n個節點的紅黑樹的高度至多為2log(n+1)" 的逆否命題是 "高度為h的紅黑樹,它的包含的內節點個數至少為 2h/2-1個"。
我們只需要證明逆否命題,即可證明原命題為真;即只需證明 "高度為h的紅黑樹,它的包含的內節點個數至少為 2h/2-1個"。
從某個節點x出發(不包括該節點)到達乙個葉節點的任意一條路徑上,黑色節點的個數稱為該節點的黑高度(x's black height),記為bh(x)。關於bh(x)有兩點需要說明:
第1點:根據紅黑樹的"特性(5) ,即從乙個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點"可知,從節點x出發到達的所有的葉節點具有相同數目的黑節點。這也就意味著,bh(x)的值是唯一的!
第2點:根據紅黑色的"特性(4),即如果乙個節點是紅色的,則它的子節點必須是黑色的"可知,從節點x出發達到葉節點"所經歷的黑節點數目">= "所經歷的紅節點的數目"。假設x是根節點,則可以得出結論"bh(x) >= h/2"。進而,我們只需證明 "高度為h的紅黑樹,它的包含的黑節點個數至少為 2bh(x)-1個"即可。
**到這裡,我們將需要證明的定理已經由"一棵含有n個節點的紅黑樹的高度至多為2log(n+1)"
轉變成只需要證明"高度為h的紅黑樹,它的包含的內節點個數至少為 2bh(x)-1個"。**
下面通過"數學歸納法"開始論證高度為h的紅黑樹,它的包含的內節點個數至少為 2bh(x)-1個"。
(01) 當樹的高度h=0時, 內節點個數是0,bh(x) 為0,2bh(x)-1 也為 0。顯然,原命題成立。
(02) 當h>0,且樹的高度為 h-1 時,它包含的節點個數至少為 2bh(x)-1-1。這個是根據(01)推斷出來的!
下面,由樹的高度為 h-1 的已知條件推出「樹的高度為 h 時,它所包含的節點樹2bh(x)-1」。
當樹的高度為 h 時,
對於節點x(x為根節點),其黑高度為bh(x)。
對於節點x的左右子樹,它們黑高度為 bh(x) 或者 bh(x)-1。
根據(02)的已知條件,我們已知 "x的左右子樹,即高度為 h-1 的節點,它包含的節點至少為 2bh(x)-1-1 個";
所以,節點x所包含的節點至少為 ( 2bh(x)-1-1 ) + ( 2bh(x)-1-1 ) + 1 = 2^bh(x)-1。即節點x所包含的節點至少為 2bh(x)-1。
因此,原命題成立。
由(01)、(02)得出,"高度為h的紅黑樹,它的包含的內節點個數至少為 2^bh(x)-1個"。
因此,「一棵含有n個節點的紅黑樹的高度至多為2log(n+1)」。
紅黑樹 RBT(一 紅黑樹定義以及簡介)
一 紅黑樹 1 介紹 紅黑樹是一種二叉查詢樹,但在每個節點上增加乙個儲存位表示節點的顏色,可以是red或black。通過對任何一條從根到葉子的路徑上的各個節點著色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出兩倍,因而是接近平衡的。2 定義 它或者是一顆空樹,或者是具有一下性質的二叉查詢樹 1 ...
紅黑樹系列之旋轉
1 概述 二叉樹是使用非常廣泛的資料結構,但如果是常規的插入,會導致二叉樹的高度過高和出現整棵樹不平衡的情況。紅黑樹是一種平衡二叉樹,c stl中的set,map及其擴充套件容器內部的資料結構都是紅黑樹。2 左旋轉 注 parent為求父親結點的函式,root是始終指向根結點記憶體區域的指標。左旋轉...
記憶體管理之紅黑樹
紅黑樹是平衡二叉樹的一種,它有很好的性質,樹中的結點都是有序的,而且因為它本身就是平衡的,所以查詢也不會出現非常惡劣的情況,基於二叉樹的操作的時間複雜度是o log n linux核心在管理vm area struct時就是採用了紅黑樹來維護記憶體塊的。先到include linux rbtree....