紅黑樹屬於平衡二叉樹。它不嚴格是因為它不是嚴格控制左、右子樹高度或節點數之差小於等於1,但紅黑樹高度依然是平均log(n),且最壞情況高度不會超過2log(n)。
紅黑樹(red-black tree) 是一棵滿足下述性質的二叉查找樹:
1. 每一個結點要么是紅色,要么是黑色。
2. 根結點是黑色的。
3. 所有葉子結點都是黑色的(實際上都是Null指針,下圖用NIL表示)。葉子結點不包含任何關鍵字信息,所有查詢關鍵字都在非終結點上。
4. 每個紅色結點的兩個子節點必須是黑色的。換句話說:從每個葉子到根的所有路徑上不能有兩個連續的紅色結點
5. 從任一結點到其每個葉子的所有路徑都包含相同數目的黑色結點
紅黑樹相關定理
1. 從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長。
根據上面的性質5我們知道上圖的紅黑樹每條路徑上都是3個黑結點。因此最短路徑長度為2(沒有紅結點的路徑)。再根據性質4(兩個紅結點不能相連)和性質1,2(葉子和根必須是黑結點)。那么我們可以得出:一條具有3個黑結點的路徑上最多只能有2個紅結點(紅黑間隔存在)。也就是說黑深度為2(根結點也是黑色)的紅黑樹最長路徑為4,最短路徑為2。從這一點我們可以看出紅黑樹是 大致平衡的。 (當然比平衡二叉樹要差一些,AVL的平衡因子最多為1)
2. 紅黑樹的樹高(h)不大於兩倍的紅黑樹的黑深度(bd),即h<=2bd
根據定理1,我們不難說明這一點。bd是紅黑樹的最短路徑長度。而可能的最長路徑長度(樹高的最大值)就是紅黑相間的路徑,等於2bd。因此h<=2bd。
3. 一棵擁有n個內部結點(不包括葉子結點)的紅黑樹的樹高h<=2log(n+1)
下面我們首先證明一顆有n個內部結點的紅黑樹滿足n>=2^bd-1。這可以用數學歸納法證明,施歸納於樹高h。當h=0時,這相當於是一個葉結點,黑高度bd為0,而內部結點數量n為0,此時0>=2^0-1成立。假設樹高h<=t時,n>=2^bd-1成立,我們記一顆樹高 為t+1的紅黑樹的根結點的左子樹的內部結點數量為nl,右子樹的內部結點數量為nr,記這兩顆子樹的黑高度為bd'(注意這兩顆子樹的黑高度必然一 樣),顯然這兩顆子樹的樹高<=t,於是有nl>=2^bd'-1以及nr>=2^bd'-1,將這兩個不等式相加有nl+nr>=2^(bd'+1)-2,將該不等式左右加1,得到n>=2^(bd'+1)-1,很顯然bd'+1>=bd,於是前面的不等式可以 變為n>=2^bd-1,這樣就證明了一顆有n個內部結點的紅黑樹滿足n>=2^bd-1。
在根據定理2,h<=2bd。即n>=2^(h/2)-1,那么h<=2log(n+1)
從這里我們能夠看出,紅黑樹的查找長度最多不超過2log(n+1),因此其查找時間復雜度也是O(log N)級別的。
紅黑樹的操作
因為每一個紅黑樹也是一個特化的二叉查找樹,因此紅黑樹上的查找操作與普通二叉查找樹上的查找操作相同。然而,在紅黑樹上進行插入操作和刪除操作會導致不 再符合紅黑樹的性質。恢復紅黑樹的屬性需要少量(O(log n))的顏色變更(實際是非常快速的)和不超過三次樹旋轉(對於插入操作是兩次)。 雖然插入和刪除很復雜,但操作時間仍可以保持為 O(log n) 次 。
紅黑樹的優勢
紅黑樹能夠以O(log2(N))的時間復雜度進行搜索、插入、刪除操作。此外,任何不平衡都會在3次旋轉之內解決。這一點是AVL所不具備的。
而且實際應用中,很多語言都實現了紅黑樹的數據結構。比如 TreeMap, TreeSet(Java )、 STL(C++)等。
