引入紅黑樹的目的是為了實現在維護bst平衡的同時,盡量控制拓撲結構調整的次數,即最好做到每次動態操作後只有o(1)次的拓撲調整。
紅黑樹的規則:
(1)樹根必須是黑色;
(2)外部節點必須為黑色;
(3)其餘節點:紅節點只能有黑孩子,即不能出現相鄰的父子兩代都為紅色;
(4)外部節點到根:所有外部節點的黑深度相同。
在紅黑樹中,提公升紅色節點,使之與黑父親等高,每顆紅黑樹都會等價於一棵4階的b樹,也叫(2,4)樹,在紅黑樹的動態調整中,借助於b樹可以方便我們理解。
呼叫bst的插入演算法,引入乙個新的末端節點,並初始化時將其染為紅色。如果其父親p也為紅色時,就會發生雙紅缺陷。
p=x->parent();//父節點
g=p->parent();//祖父節點
u=(p==g->lc)?g->rc:g->lc;//叔父節點
(1)叔父節點u為黑色時,有如下兩種情況
對應問題為在b樹中,超級節點內有兩個相鄰的紅色節點,可做一次3+4重構,並將中間的紅色節點染為黑色,另乙個相鄰的黑色節點染為紅色解決。
(2)叔父節點u為紅色時,也有如下兩種情況
對應問題為在b樹中,超級節點發生了上溢,可模仿b樹的處理方法,進行一次**操作。p與u轉黑,g轉紅,節點**,g上公升一層,但有可能在更高層引發雙紅缺陷。
但是只要做過一次重構,調整就會結束。
(1)s為黑,且至少有乙個紅孩子t,p隨意
對應於b樹中,刪除節點後發生下溢,可通過旋轉借關鍵碼解決。
(2)s為黑,且兩個孩子均為黑,p為紅
s轉紅,p轉黑,拓撲結構不變,所有子節點的黑深度都減小乙個,仍然相等,刪除操作結束。
(3)s為黑,且兩個孩子均為黑,p為黑
s轉紅,紅黑樹的性質在區域性得以恢復,但是上層節點會發生下溢,最差情況遞推至根節點。
(4)s為紅
s轉黑,p轉紅,此時問題轉化為(1)或(2)。
綜上,雙黑缺陷需要1次的拓撲調整,和最多o(logn)次的重染色,即可恢復。
紅黑樹原理
若左子樹不為空,則左子樹上所有節點的值都小於根節點的值 若右子樹不為空,則右子樹上所有節點的值都大於根節點的值 且左右子樹都為二叉搜尋樹 查詢 必須從根節點開始查詢 如果值比根節點大則查詢右子樹,否則左子樹,直到找到節點 插入 與查詢類似 逐個節點對比,直到找到滿足條件的null,就插入到相應位置 ...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...