紅黑樹的修正

2021-10-25 21:42:51 字數 1407 閱讀 1691

紅黑樹有什麼特性?

(1)每個節點或者是黑色,或者是紅色。

(2)根節點是黑色。

(3)每個葉子節點(nil)是黑色。 [注意:這裡葉子節點,是指為空(nil或null)的葉子節點!]

(4)如果乙個節點是紅色的,則它的子節點必須是黑色的。

(5)從乙個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。

node 當前節點

returnpoint

若node的父節點存在,且父節點是紅色

|---- 若父節點是祖父節點的左孩子

|       |---- 若叔叔節點是紅色

|       |       |---- 叔叔節點與父節點變為黑色,祖父節點變為紅色

|       |       |---- node賦值祖父節點,返回returnpoint

|       |---- 若叔叔節點是黑色

|               |---- 若node是父節點的右孩子

|               |       |---- 將現在的父結點存為tmp,左旋父節點

|               |       |---- 當前節點變為黑色,祖父節點變為紅色

|               |       |---- 右旋祖父節點

|               |       |---- node賦值tmp,返回returnpoint,對旋轉後的原父節點進行修復

|               |---- 若node是父結點的左孩子

|                       |---- 父節點變為黑色,祖父節點變為紅色

|                       |---- 右旋祖父節點

|                       |---- 返回returnpoint

|---- 若父節點是祖父節點的右孩子

|---- 若叔叔節點是紅色

|       |---- 叔叔節點與父節點變為黑色,祖父節點變為紅色

|       |---- node賦值祖父節點,返回returnpoint

|---- 若叔叔節點是黑色

|---- 若node是父節點的左孩子

|       |---- 將現在的父結點存為tmp,右旋父節點

|       |---- 當前節點變為黑色,祖父節點變為紅色

|       |---- 左旋祖父節點

|       |---- node賦值tmp,返回returnpoint,對旋轉後的原父節點進行修復

|---- 若node是父結點的右孩子

|---- 父節點變為黑色,祖父節點變為紅色

|---- 右旋祖父節點

|---- 返回returnpoint

離開迴圈,說明當前節點為根節點,將當前節點變為黑色

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...

紅黑樹筆記 紅黑樹的插入操作

紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...