目录
1. 红黑树的基本特征
① 结点必须是红色或黑色;
② 根节点必须为黑;
③ 空叶子为黑;
④ 红色结点的孩子必然是黑(即从根结点出发到空叶子的任意路径上不存在连续的红色结点);
⑤ 从根出发到所有空叶子的所有简单路径上黑色结点数必须相等。
2. 红黑树的插入
情况一:插入位置为根结点---直接插入;
情况二:插入位置不是根结点,且双亲节点为黑---直接插入;
情况三:插入位置不是根结点,且双亲结点为红,叔叔结点为红---
将双亲结点染色为黑,向上调整,将祖父结点染色为红,再将祖父结点作为新插入结点重复上述操作。
情况四:插入位置不是根结点,且双亲结点为红,叔叔结点为红---
G(B) P(B)
/ \ / \
P(R) U(B) 右旋-> N(R) G(R)
/ \
N(R) U(B)
G(B) P(B)
/ \ / \
U(B) P(R) 左旋-> G(R) N(R)
\ /
N(R) U(B)
情况五:插入位置不是根结点,且双亲结点为红,叔叔结点为红---
G(B) G(B)
/ \ / \
P(R) U(B) 左旋-> N(R) U(B) = 情况四的1
\ /
N(R) P(R)
G(B) G(B)
/ \ / \
U(B) P(R) 右旋-> U(B) N(R) = 情况四的2
/ \
N(R) P(R)
3. 红黑树的删除
情况一:被删除结点无子节点,且被删除结点为红---直接删除
情况二:被删除结点无子节点,且被删除结点为黑
1.兄弟结点为黑,且有一个同方向上的红色子节点
1.1 F(u) B(U)
/ \ / \
N(B) B(B) B左旋-> F(B) S(B)
\ /
S(R) N(B)
1.2 F(u) B(U)
/ \ / \
B(B) N(B) B右旋-> S(B) F(B)
/ \
S(R) N(B)
2.兄弟结点为黑,且有一个不同方向上的红色子节点
2.1 F(U) F(U)
/ \ / \
N(B) B(B) B右旋-> N(B) S(B) = 1.1的情形
/ \
S(R) B(R)
2.2 F(U) F(U)
/ \ / \
B(B) N(B) B左旋-> S(B) N(B) = 1.2的情形
\ /
S(R) B(R)
3.兄弟结点为黑,且无红色子节点
3.1 F(R) F(B)
/ \ / \ ->向上调整
N(B) B(B) 染色-> N(B) B(R)3.2 F(B) F(B)
/ \ / \ ->向上调整
N(B) B(B) 染色-> N(B) B(R)4.兄弟结点为红,则父节点必为黑
4.1 F(B) B(B)
/ \ / \
N(B) B(R) B左旋-> F(R) = 上述情形中的一种
/
N(B)
4.2 F(B) B(B)
/ \ / \
B(R) N(B) B右旋-> F(R) = 上述情形中的一种
\
N(B)
情况三:被删除结点有一个子结点,且被删结点为黑---直接删除该结点,让子结点补位并染黑。情况四:被删除结点有两个子结点---将被删除结点的值与其前驱或后继结点交换,然后删除其前驱/后继结点,转化为上述情况中的一种。