詳細可參考如下兩個連接:
紅黑樹(1) - 介紹
紅黑樹(2) - 插入操做
spa
在插入操做中,最多見的違反紅黑樹屬性的一種狀況是存在兩個連續的紅色節點。.net
而在刪除操做中。常見的狀況是,當刪除節點是黑色時,會影響從根節點到葉子的黑色節點高度。違反紅黑樹的性質5。blog
刪除的過程相對照較複雜。爲了便於理解刪除過程,咱們將使用到"double black"的概念。當一個黑色節點被刪除,並且被它的黑色孩子代替時,這個孩子就標記爲double black。所以,基本的工做就變爲了將這個double black轉換爲single black。
ci
在如下的內容裏。d表示被刪節點。c表示將用於替換d的孩子節點。get
例如如下圖所看到的。這種話。咱們僅僅需要處理被刪節點是葉子或僅僅有一個孩子的這種狀況。class
50 60 60
/ \ delete(50) / \ delete(60') / \
40 70 -----------------> 40 70 ------------------> 40 70
/ \ 後繼節點賦值 / \ 刪除後繼節點 \
60 80 給被刪節點 60' 80 80
原理與後繼節點類似。這裏再也不描寫敘述。原理
30 30
/ \ delete(20) / \
20 40 -------------> 10 40
/
10
30 30
/ \ delete(10) / \
10 40 -------------> 20 40
\
20
30 30
/ \ delete(20) / \
20 40 -------------> 10 40
/
10
30 30
/ \ delete(10) / \
10 40 -------------> 20 40
\
20
40 40 40 / \ delete(20) / \ delete(30') / \ 20 50 ----------------------> 30 50 ---------------------> 30 50 / \ 運行步驟2.1,將d的 / \ 此時轉換爲了刪除葉子30'. / 10 30 後繼節點的值賦給d. 10 30' 10
40 40 40 / \ delete(20) / \ delete(30') / \ 20 50 ----------------------> 30 50 ---------------------> 30 50 / \ 運行步驟2.1,將d的 / \ 此時轉換爲了刪除葉子30'. / 10 30 後繼節點的值賦給d. 10 30' 10
因此,假設刪除的是黑色葉子,則也會引起double black操做。二叉樹
30 40
/ \ delete(20) / \
20 40 -------------> 30 50
\
50
a. Left Left Case (s是左孩子,且r是s的左孩子或者s的兩個孩子都是紅色)。搜索
這樣的情形與如下的Right Right Case正好相反。遍歷
b. Left Right Case (s是左孩子,且r是s的右孩子)。這樣的情形與如下的Right Left Case正好相反。
c. Right Right Case (s是右孩子,且r是s的右孩子或者s的兩個孩子都是紅色)。