红黑树的删除
来源:互联网 发布:海军知耻陆军马鹿 编辑:程序博客网 时间:2024/04/28 05:31
红黑树的删除操作比较复杂。首先我们知道,被删除节点y永远只有一个子树(原因是,如果有两个子树的话,我们就会删除它的直接后继,它的直接后继最多有一个子树;如果它没有子树的话,我们就把它的右子树定为nil)。nil是一个用来取代NULL的节点,颜色为黑。
下面我们分情况来讨论:
- 如果y和x在左子树上
- 如果被删除节点y为红色,那么可以直接用它的黑儿子x来取代它。
- 如果被删除的节点y是黑色的话,x是y的儿子,那么就继续分情况讨论。
2.1.若x是红色的话,将x的颜色改为黑色。调整结束。
2.2.如果x是黑色的话。那么为了保证黑高度,x节点的颜色就变为为黑+黑(只是代表,见算法导论)用w指向x的兄弟节点。这违反了或红或黑原则。所以需要调整。下面要继续分情况讨论
2.2.1.如果x是root,那么调整结束。
2.2.2.如果x的兄弟节点w是红色的话
将P变成红色,S变为黑色,然后对P进行左旋操作。这样就可以转化成以下的情况2.2.3.2 2.2.4或者2.2.5来处理。
2.2.3.如果x,w都是黑色的,w的儿子也是黑色的。继续分情况讨论
2.2.3.1.如果x的父亲是黑色的
将S(w)和N(x)都抽出一点黑色,那么N变为黑色,S变为红色,P则变为黑+黑,x指向P。继续调整下去。
2.2.3.2.如果x的父亲是红色的
将S(w)和N(x)都抽出一点黑色,那么N变为黑色,S变为红色,P则变为黑色,调整结束。
2.2.4.如果x,w的颜色都是黑色,w的左儿子是红色,右儿子是黑色。
只对w的子树进行操作,不动x和x的父亲。将S染成红色,然后S右旋。则转化成情况2.2.5.继续调整。
2.2.5.如果x,w的颜色都是黑色,w的右儿子是红色,左儿子不管。
交换P和S的颜色,SR染成黑色,然后对P左旋,调整结束。
- 如果y和x在右子树上,情况与上面极其相似,不再详细介绍。
- 如果被删除节点y为红色,那么可以直接用它的黑儿子x来取代它。
- 如果被删除的节点y是黑色的话,x是y的儿子,那么就继续分情况讨论。
2.1.若x是红色的话,并将x的颜色改为黑色。
2.2.如果x是黑色的话。用w指向x的兄弟节点,用指针x指向该节点,它的颜色为黑+黑。这违反了或红或黑原则。所以需要调整。下面要继续分情况讨论
2.2.1.如果x是root,那么调整结束。
2.2.2.如果x的兄弟节点w是红色的话
2.2.3.如果x,w都是黑色的,w的儿子也是黑色的。继续分情况讨论
2.2.3.1.如果x的父亲是黑色的
2.2.3.2.如果x的父亲是红色的
2.2.4.如果x,w的颜色都是黑色,w的右儿子是红色,左儿子是黑色。
2.2.5.如果x,w的颜色都是黑色,w的左儿子是红色,右儿子不管。
图片来自维基百科。
参考文献:
- 维基百科。
- 算法导论
- 红黑树的删除
- 红黑树的删除
- 红黑树的删除
- 红黑树的删除
- 红黑树 节点的删除
- 红黑树删除的实现
- 红黑树的删除
- 红黑树结点的删除
- 红黑树的插入与删除
- 红黑树的建立,插入,删除
- 红黑树的添加删除操作
- 红黑树的删除及其实例
- 红黑树的插入与删除
- 红黑树 删除 背后的思想
- 红黑树的插入和删除
- 红黑树的删除与维护
- 红黑树的插入与删除
- 红黑树的插入与删除
- centos LAMP与phpmyadmin的安装
- 幸福其实简单
- 整理json数据相关的(项目实践)
- 我曾经问个不休
- 当错到了极限,就会开始朝着正确逆袭
- 红黑树的删除
- Spring容器Bean的作用域
- 关于hibernate中的对应关系
- popover 再iphone 上使用
- Github for windows clone失败的问题
- 赶不上春天,无法同其它植物竞相开放
- ZooKeeper之java客户端访问-入门介绍
- EnergySource
- Android初试--LinearLayout(线性布局)