一,紅黑樹介紹
什么是紅黑樹?為什么需要紅黑樹?
對數據集合進行 查找、插入、刪除、找最大結點、找最小結點、找前驅/后繼結點 是一種很常見的需求,那如何找到一種數據結構來高效地實現前面的各個基本操作呢?根據這篇博文對各種樹 進行了的基本介紹。AVL樹雖然能保證各種基本操作在O(logN)內實現,但是它的旋轉操作復雜,更常用的是紅黑樹。
紅黑樹就是一棵特殊的二叉查找樹。它能保證在最壞的情況下,上面列出的所有基本操作的時間復雜度為O(logN)
那它是如何做到這一點的呢?下面列出的紅黑樹的性質就保證了對數時間復雜度。
①每個結點要么是紅的,要么是黑的
②根結點是黑的
③每個葉結點(NIL)是黑的--注意:這里的葉結點與平常討論的樹的葉結點不同。這里的葉結點是數據域為NIL的結點,而平常說的葉結點是:它的左右孩子為NIL的結點。
④若結點是紅的,則它的兒子都是黑的
⑤對每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑結點
上面的五點性質保證了紅黑樹的高度是logN,從而,保證了所有的基本操作的時間復雜度是O(logN)
二,紅黑樹為什么能保證各項基本操作的時間復雜度為對數級O(logN)
現在來證明為什么紅黑樹的高度是logN。
證明:一棵有 n 個內結點的紅黑樹的高度至多是 2log(n+1)
葉結點:數據域為NIL的結點。內結點(非葉結點):數據域不為NIL的結點。紅黑樹中每個結點有五個域(字段):①顏色 ②數據域(key) ③左指針 ④右指針 ⑤父結點指針
首先定義一個黑高度概念:從某個結點 x 出發,到達一個葉結點的任意一條路徑上,黑色結點的個數 稱為黑高度。記為 bh(x)
首先用數學歸納法可以證明:以 結點 x 為根的子樹中至少包含 2bh(x) -1 個內結點。
其次,假設紅黑樹的高度為h(根結點的高度為0),由性質④可知:從根結點(不包括根)到葉結點的任一簡單路徑上至少有一半的結點是黑色的,從而根的黑高度至少是 h/2
再根據上面數學歸納法的結論:紅黑樹的根結點的子樹中至少包含 2h/2-1 個內結點。
從而有: n >= 2h/2 -1, 得出 h <= 2log(n+1),從而證明了紅黑樹的高度是O(logN)
這種情況下:n=3,h=1,根的黑高度為1
這種情況下:n=15,h=3,根的黑高度為1
三,紅黑樹的基本操作
①插入操作--具體實現細節就不討論了
插入部分主要分成三大步驟:
第一步:與二叉查找樹中插入一個結點類似,將待插入的結點與紅黑樹中各個結點遞歸比較,若待插入的結點權值大,則插入到右子樹中;若待插入的結點權值小,則插入到左子樹中。
第二步:由第一步可知,待插入的結點現在已經放到了紅黑樹的最后一層,將該結點標記為紅色。
第三步:對插入的結點進行調整,以保證紅黑樹的性質不被破壞。調整主要包括各種旋轉操作。而且旋轉操作只會改變指針的指向,因此旋轉的時間復雜度為O(1)
②刪除操作
刪除一個結點時,也會破壞紅黑樹的性質,因此,也需要進行調整。具體細節參考《算法導論》