详细可參考以下两个链接:
红黑树(1) - 介绍
红黑树(2) - 插入操作
在插入操作中,最常见的违反红黑树属性的一种情况是存在两个连续的红色节点。
而在删除操作中。常见的情况是,当删除节点是黑色时,会影响从根节点到叶子的黑色节点高度。违反红黑树的性质5。
删除的过程相对照较复杂。为了便于理解删除过程,我们将使用到"double black"的概念。当一个黑色节点被删除,而且被它的黑色孩子代替时,这个孩子就标记为double black。因此,基本的工作就变为了将这个double black转换为single black。
在以下的内容里。d表示被删节点。c表示将用于替换d的孩子节点。
例如以下图所看到的。这种话。我们仅仅须要处理被删节点是叶子或仅仅有一个孩子的这种情况。
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
4.1. 孩子节点c是double black
所以,假设删除的是黑色叶子,则也会引发double black操作。
30 40
/ \ delete(20) / \
20 40 -------------> 30 50
\
50
4.2. d是double black。或者d不是根节点
4.2.1. s是黑色,而且s的孩子中至少有一个是红色。则进行旋转
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的两个孩子都是红色)。
4.2.2. s是黑色,而且s的两个孩子都是黑色(包含s是叶子)
a. 假设s的父节点是黑色,则做完删除操作后,还须要检測父节点。
4.2.3. s是红色,运行旋转操作,提升s。而且又一次着色s以及它的父节点