红黑树 删除 背后的思想(转自博客园)
来源:互联网 发布:java回调函数的理解 编辑:程序博客网 时间:2024/06/01 19:14
一 红黑树的删除节点
第一步删除节点,先找到需要删除的节点
void rb_erase(struct rb_node *node, struct rb_root *root)
1 左孩子为空,右孩子为空
则 直接删除这个节点。child = NULL, parent为 node的parent。
如果node is black ,需要调用调整函数__rb_erase_color(child, parent, root);
2 左孩子 为空,右孩子不为空,
删除的节点为node,child = node->right,parent = node->parent。
如果node is black ,需要调用调整函数 __rb_erase_color(child, parent, root);
3 左孩子存在,右孩子为空
删除节点为node, child = node->left,parent = node->parent;
如果node is black 调用 调整函数__rb_erase_color(child, parent, root);
4 左孩子不为空,右孩子也不为空
右孩子存在,则寻找node的后继,即寻找右孩子为根的具有最小key的节点。换言之寻找 左孩子的左孩子的左孩子,直到,没有左孩子节点为止。
node = node->rb_right;
while ((left = node->rb_left) != NULL)
node = left;
child = node->rb_right;
node 为入参node的后继, child 为 找到的后继的右孩子(可能为NULL)。
情况1 入参node的右孩子有左孩子
首先用old 保存要删除的node参数,然后去查找node的后继
因为node 的右孩子有左孩子,所以一直去找左孩子,直到找到没有左孩子的节点,
将这个节点记为 node ,node的父亲记为parent ,node->right = child(可能为NULL)
其实表面上看 我们删除的是old 这个节点,实际上我们删除的是node的这个节点,我们看一下,
删除之后的效果就可以理解, old被删除了,但是node填充old 的位置。 node 被摘走了,
node 没有左孩子只有右孩子,右孩子就交给parent领养。即child的父亲变成了parent,
parent的左孩子变成了child。
- 红黑树 删除 背后的思想(转自博客园)
- 红黑树 删除 背后的思想
- 面向对象编程思想 (转自博客园的 supers)
- COM思想的背后
- 韩信点兵背后的思想
- c++强大背后(转自qiangtiantian的笔记)
- 删除表中重复记录--转自博客园(LazyBee)
- 极限背后的直观思想
- 设计模式背后的思想
- typedef 的用法(转自博客园)
- OOP的基本原则(转自博客园)
- AsyncTask的用法(转自博客园)
- HibernateSynchronizer(转自沉淀思想的blog)
- const用法(转自博客园)
- 古井集团高管全军覆没的背后(转自金融界2009)
- 转自csdn排名第一博主 成功的背后
- 有思想的博客
- BlockingQueue(转自博客园)
- vi编辑器命令应用
- VS2012下基于Glut OpenGL GL_TRIANGLES示例程序:
- REST Client学习笔记
- 数组和指针
- 吐槽
- 红黑树 删除 背后的思想(转自博客园)
- golang实现Fibonacii的几种算法
- 第 2 章 Hibernate入门
- Android中的Handler详解以及和Thread的区别
- Java内部类与final关键字详解
- 哥德巴赫猜想 java 实现
- 利用iOS API编写简单微博客户端全过程
- diskpart硬盘分区
- 第 3 章 体系结构(Architecture)