淺嚐紅黑樹

2022-07-12 09:21:10 字數 2458 閱讀 9236

目錄右旋

紅黑樹的插入

插入修復偽**

不用修復的情況:

插入修復情況1

插入修復情況2

插入修復情況3

紅黑樹的刪除

刪除修復情況2

刪除修復情況3

刪除修復情況4

後記引用參考

每個結點不是紅就是黑(非紅即黑)

根結點是黑的(根黑)

每個葉結點:指樹尾端nil指標或null結點,是黑的(nil/null黑)

如果乙個結點是紅的,那麼它的倆個兒子都是黑的,即從每個葉子到根的所有路徑上都不能有兩個連續的紅色結點(紅父黑孩)

對於任一結點而言,其到葉結點樹尾端nil指標的每一條路徑都包含相同數目的黑結點(路徑黑同數)

左旋左旋偽**:

left-rotate(t, x)
對左旋的理解

右旋右旋偽**

right-rotate(t,x)
對右旋的理解

插入偽**

rb-insert(t,z)

z.p = y

if(y == nil[t]) t.root = z//判斷z要插入的位置

else if(z.key < y.key) y.left = z

else y.right = z

z.left = t.nil

z.right = t.nil

z.color = red

rb-insert_fixup(t,z)

}

為什麼插入的結點要染成紅色呢?

插入修復偽**

rb-insert-fixup(t,z)

else //情況3:當前結點是父結點的左子

z.p.color = black//父變黑

z.p.p.color = red//祖變紅

right-rotate(t,z.p.p)//祖右旋}}

else

else

z.p.color = black

z.p.p.color = red

left-rotate(t,z.p.p)}}

}t.root.color = black//根肯定是黑的

return root

}

(特此說明:當前代指當前結點,父代指父結點,叔代指父的兄弟結點,祖代指祖父結點,數字1,2,3,4,5代指上述對應性質)

不用修復的情況:

插入的是根結點

插入的結點的父結點是黑色

插入修復情況1

為什麼這麼做?

插入修復情況2

為什麼這麼做?

插入修復情況3

為什麼這麼做?

刪除偽**

rb-transplant(t,x,y)

rb-delete(t,z)

else if(z.right == t.nil)

else

rb-transplant(t,z,y)//用y頂替z的位置

y.left = z.left//y接管z的左孩子

y.left.p = y

y.color = z.color//y接管z的顏色

}//如果y原來是黑色的,進行修復

if(y-origial-color == black) rb-delete-fixup(t,x)

}

刪除修復偽**
rb-delete-fixup(t,z)

if(w.left.color == black && w.right.color == black)

else //情況4:兄的孩左右皆紅

w.color = z.p.color //兄顏色變為父

z.p.color = black //父變黑

w.right.color = black //兄右孩變黑

left-rotate(t,z.p) //父左旋

z = t.root //當前為根}}

else

if(w.right.color == black && w.left.color == black)

else //情況4:兄的孩左右皆紅

w.color = z.p.color //兄顏色變為父

z.p.color = black //父變黑

w.left.color = black //兄左孩變黑

right-rotate(t,z.p) //父右旋

z = t.root //當前為根}}

}z.color = black

}

理解修復的準備

修復思路

刪除修復情況1

問一句為什麼?

刪除修復情況2

問一句為什麼?

刪除修復情況3

問一句為什麼?

刪除修復情況4

問一句為什麼?

教你透徹了解紅黑樹

紅黑樹下 紅黑樹的實現

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

紅黑樹下 紅黑樹的實現

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

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

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