红黑树
2016-07-27 21:52
253 查看
性质:
(1)每个结点要么是红色,要么是黑色;(2)根结点是黑的;
(3)每个叶节点,即空结点是黑的;
(4)如果一个结点是红的,那么的它的两个儿子都是黑的;
(5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点;
插入操作
每次插入的节点初始都为红色。1、当父亲为黑色时,不影响平衡,这就比AVL树旋转的几率要小一些。
2、当父亲为红色时,祖父肯定为黑色,这时就需要看父亲的兄弟的颜色,就是叔父的颜色。
2.1叔父为红色:这样只需要把祖父变为红色,父亲和叔父变为黑色就好了。 2.2叔父为黑色:就有下面四种情况。
删除操作
红黑树本身是一棵二叉查找树,它的删除和二叉查找树的删除类似。首先要找到真正的删除点,当被删除结点n存在左右孩子时,真正的删除点应该是n的中序遍在前驱。性质:
* 1、 删除操作中真正被删除的必定是只有一个红色孩子或没有孩子的结点。
* 2、 如果真正的删除点是一个红色结点,那么它必定是一个叶子结点。
在以下讨论中,我们使用蓝色箭头表示真正的删除点,它也是旋转操作过程中的第一个判定点;真正的删除点使用“旧”标注,旧点所在位置将被它的的孩子结点所取代(最多只有一个孩子),我们使用“新”表示旧点的孩子结点。
1、旧节点为红色
若旧点为红色结点,则它必定是叶子结点,直接删除即可
2、一红一黑
当旧点为黑色结点,新点为红色结点时,将新点取代旧点位置后,将新点染成黑色即可(如图12所示)。这里需要注意:旧点为红色,新点为黑色的情况不可能存在。
3、双黑
当旧点和新点都为黑色时(新点为空结点时,亦属于这种情况),情况比较复杂,需要根据旧点兄弟结点的颜色来决定进行什么样的操作。我们使用“兄”来表示旧点的兄弟结点。这里可分为红兄和黑兄两种情况:
3.1:红兄 由于兄弟结点为红色,所以父结点必定为黑色,而旧点被删除后,新点取代了它的位置。下图演示了两种可能的情况: 红兄的情况需要进行RR或LL型旋转,然后将父结点染成红色,兄结点染成黑色。然后重新以新点为判定点进行平衡操作。我们可以观察到,旋转操作完成后,判定点没有向上回溯,而是降低了一层,此时变成了黑兄的情况。
3.2:黑兄 黑兄的情况最为复杂,需要根据黑兄孩子结点(这里用“侄”表示)和父亲结点的颜色来决定做什么样的操作。 3.2.1 黑兄二黑侄红父 如图14所示,这种情况比较简单,只需将父结点变为黑色,兄结点变为黑色,新结点变为黑色即可,删除操作到此结束。
3.2.2 黑兄二黑侄黑父 如图15所示,此时将父结点染成新结点的颜色,新结点染成黑色,兄结点染成红色即可。当新结点为红色时,父结点被染成红色,此时需要以父结点为判定点继续向上进行平衡操作。
3.2.3 黑兄红侄 黑兄红侄有以下四种情形,下面分别进行图示:
相关文章推荐
- 测试语义记忆的方法
- HTML5之本地存储
- 大串中查找小串出现的次数
- 【51nod 1135 原根】
- java实现求两个数的最大公约数
- UNIX/LINUX C总结
- 买饭问题
- java数据结构(循环链表)
- Cocos2dx 场景切换动画
- win 10 安装 mysql解压版 步骤
- GCC下32位与64位机器类型变量所占字节数
- HDU 1527 取石子游戏(威佐夫博弈)
- mysql生成不重复随机数(unique number generation)
- C# 委托和事件
- 简易时钟 Date对象 for...in...语句 replace方法
- #CentOS on Mac#3.进程通信
- Java多线程
- 随机数的使用
- jquery mobile 入门级实战1
- JS, Node.js, npm简介