详细可參考如下两个连接:
红黑树(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的两个孩子都是红色)。