1. 红黑树是二叉查找树.
2. 插入
要点
1. 插入新节点总是红色节点
2. 如果插入节点的父节点是黑色,RB性质不变
3. 如果插入节点的父节点是红色, 破坏了性质. 重新着色或旋转
算法
假设要插入的节点标为N,N的父节点标为P,N的祖父节点标为G,N的叔父节点标为U.
1. N = root, N->黑, over。
2. P = 黑, over。
3. P = 红 (P可能是G的左孩子,也可能是右孩子,以下只说明左孩子的情况)
3. 1 U = 红 如下变换,over.
3.2 U = 黑 N为P的右孩子,P为G的左孩子 (同理 :U = 黑 N为P的左孩子,P为G的右孩子) -> 转 3.3
3.3 U = 黑 N为P的左孩子,P为G的左孩子 (同理 :U = 黑 N为P的右孩子,P为G的右孩子) over.
3. 删除
(前提:删除节点只有一个非空孩子,
如果有两个非空孩子,用此节点前驱(或后继)的值替换此节点的值,注意只是值,此节点和此节点的前驱(或后继)的颜色维持不变。)
要点
如果删除节点有非空孩子,用此孩子替换掉删除节点。注意是整个节点替换,包括颜色。
如果删除节点没有非空孩子,用任一叶子节点替换。(叶子永远是黑色).
1. 如果删除节是黑色, RB性质不变
2. 如果删除节是红色, 破坏了性质. 重新着色或旋转
算法
假设N为删除节点(d)的孩子,N的父节点为P,N的祖父节点标为G,S为N的兄弟节点,SL,SR分别为S的左右子节点.
1. d = 红, 删除,over。
2. N =红 ,d=黑,设置N=红,除了N变为root。over。
3. 1 P黑, S, SL, SR全黑, 如下变色处理,然后以P为N转case 1
3.2 P黑, S红, SL,SR全黑, 如下旋转变色,转下面case5处理
4. P为红,S, SL,SR全黑, 如下变换, over
5. P不管为红还是黑,S为P的右孩子,S黑, SL红,SR黑, 如下旋转变色,转下case
6. 如下,over