红黑树-删除节点
2018-03-13 23:09
211 查看
红黑树删除步骤分为两个:delete 和 delete-fixup
假定要删除的节点的指针为 node。
case 1:node只有右子节点。
case 2:node只有左子节点。
case 3:node有两个子节点,且node的后继是node的右子节点。
case 4:node有两个子节点,且node的后继是node的左子节点。
过程涉及的因素有
1. 被删除节点node. node可能是根。
2. node的后继y.
3. y的右子节点x.
4. node的颜色。
5. y的颜色。
删除过程如下,先不考虑违背了哪些性质。
预处理, 令 y = node , 用 y-original-color 储存 y的颜色。分情况讨论:
如果y是node的右子节点。令x->p指向y。算法导论中对此有一段解释:在case 3中,假设 x = y->r = T.NIL, 那么x是个叶节点,这时候需要人工将叶节点NIL的p指针设置为y,在x 非 NIL的情况下 下,这操作不起任何作用。
如果y非node的右子节点。将y从原来的位置剥离开,x代替y的位置。
用y代替node节点,y的与node的子节点的关系完全取代node与node子节点的关系(关系调整)。并把y的颜色设置为node的颜色。
case 2: y指向node,x指向node的左子节点,y-original-color是node的颜色。
case 3: y指向z的后继,x指向y的右子节点,y-original-color是node后继的颜色。
case 4: y指向z的后继,x指向y的右子节点,y-original-color是node后继的颜色。
fixup操作中,也用到转化策略。首先对于给点的节点x,有五种情况
(假定x是其父节点的左节点,当然还有另外的镜像情况)s是x的兄弟。
1. case 0:x是树新的根。
2. case 1:s是红色的。
3. case 2:s是黑色,s的两个子节点都是黑色的。
4. case 3:s是黑色,s的左子节点为红,右子节点为黑。
5. case 4:s是黑色,s的右子节点为红。
fixup采用讲case 1的情况转化为case 2,3 或者4的策略。
case 1 –> case 4
case 1 –> case 2 –> case 4
case 1 –> case 3 –> case 4
当y代替了node后,原本含y的简单路径的黑高减去1;因此要设法使得bh恢复。
假定要删除的节点的指针为 node。
移植(Transplant)
删除过程中遇到用某节点u代替某节点v的情况,则调用Transplant(u,v),用来处理好 v 与 u->p 的链接关系。删除
过程一共有四种情况:case 1:node只有右子节点。
case 2:node只有左子节点。
case 3:node有两个子节点,且node的后继是node的右子节点。
case 4:node有两个子节点,且node的后继是node的左子节点。
过程涉及的因素有
1. 被删除节点node. node可能是根。
2. node的后继y.
3. y的右子节点x.
4. node的颜色。
5. y的颜色。
删除过程如下,先不考虑违背了哪些性质。
预处理, 令 y = node , 用 y-original-color 储存 y的颜色。分情况讨论:
case 1
令x指向node的右子节点,用x代替node。判断是否要fixup.case 2
令x指向node的左子节点,用x代替node。判断是否要fixup。case 3&4
令y指向node的后继,储存y的颜色(此时y-original-color是node的后继的颜色)。令x指向y的右子节点。判断是否要fixup。如果y是node的右子节点。令x->p指向y。算法导论中对此有一段解释:在case 3中,假设 x = y->r = T.NIL, 那么x是个叶节点,这时候需要人工将叶节点NIL的p指针设置为y,在x 非 NIL的情况下 下,这操作不起任何作用。
如果y非node的右子节点。将y从原来的位置剥离开,x代替y的位置。
用y代替node节点,y的与node的子节点的关系完全取代node与node子节点的关系(关系调整)。并把y的颜色设置为node的颜色。
各因素的变化
case 1: y指向node,x指向node的右子节点, y-original-color是node的颜色。case 2: y指向node,x指向node的左子节点,y-original-color是node的颜色。
case 3: y指向z的后继,x指向y的右子节点,y-original-color是node后继的颜色。
case 4: y指向z的后继,x指向y的右子节点,y-original-color是node后继的颜色。
删除后的分析
我有一个疑问:为什么case 1和2中,会被fixup的是node的子节点,而在case 3和4中,会被fixup的是node的后继的子节点?注意到算法导论中RB-delete()的第20行,将y涂为node的颜色。原本node的颜色也会影响bh,y被剥离,所以y的颜色也会影响bh。y代替了node,将y涂为node的颜色等同于“node没被删除”,故也不用考虑node的颜色的影响。总而言之,4种情况中,都只需考虑一个节点(node的子节点或其后继的子节点)的颜色带来的影响,将这个节点命名为x,对其进行fixup操作。fixup操作中,也用到转化策略。首先对于给点的节点x,有五种情况
(假定x是其父节点的左节点,当然还有另外的镜像情况)s是x的兄弟。
1. case 0:x是树新的根。
2. case 1:s是红色的。
3. case 2:s是黑色,s的两个子节点都是黑色的。
4. case 3:s是黑色,s的左子节点为红,右子节点为黑。
5. case 4:s是黑色,s的右子节点为红。
fixup采用讲case 1的情况转化为case 2,3 或者4的策略。
case 1 –> case 4
case 1 –> case 2 –> case 4
case 1 –> case 3 –> case 4
当y代替了node后,原本含y的简单路径的黑高减去1;因此要设法使得bh恢复。
相关文章推荐
- 红黑树删除节点细节总结
- 红黑树 删除某节点后 旋转3次 举例
- 红黑树 节点的删除
- 一种新的删除红黑树节点的算法
- 算法练习五 红黑树下 节点删除
- 红黑树插入删除节点过程分析 && C代码实现
- 理解红黑树的节点插入和删除
- 红黑树之删除节点
- 算法导论 红黑树 节点删除
- 红黑树的删除和添加节点
- 算法导论 红黑树 节点删除
- 算法练习五 红黑树下 节点删除(转)
- 红黑树(改进版) -- 新增删除节点的方法实现
- 红黑树节点的删除操作
- 一种新的删除红黑树节点的算法
- 红黑树删除某个节点的方法
- 数据结构之链表面试题汇总(四)得到两个单链表相交的第一个交点、用O(1)的时间效率删除单向链表中的指定节点
- 演示2-3树删除时为什么空节点只有一个子节点
- C#操作XML(读XML,写XML,更新,删除节点,与dataset结合等)
- C#中操作xml文件(插入节点、修改、删除)