当前课程知识点:数据结构(下) > 第八章 高级搜索树(下) > (xa3)红黑树:插入 > 08XA3-5 RR-2
再来看互补的另一种情况
也就是叔父节点u不是黑的 而是红的
同样的 不失一般性 这里也只给出了两种情况
忽略掉对称的另两种情况
那么当叔父节点u是红色的时候
x和p所构成的双红缺陷又当如何解释呢
我们同样借助提升变换
将所有指向红色节点的虚边收缩起来
于是从B树的角度来看 局部的这4个节点
将合并为一个包含4个关键码的超级节点
没错 4个关键码 对应于5个分支
看出问题了?是的 无论是它 还是它
这样的超级节点在4阶B树中都是非法的
而用B树的语言来说 它们之所以非法
是因为它们刚刚发生上溢
因此 与其说我们是在红黑树中修复双红缺陷
不如说是在对应的4阶B树中修复上溢缺陷
这二者完全是一回事
你应该还记得在B树中如何修复上溢
是的 我们需要在出现问题节点中找到居中的那个关键码
并且以它为界 将原先的大节点
分裂为左右两个新的节点
而居中分界的这个关键码 则应被取出来
上移并插入到父节点中的适当位置
这样一个转换的过程
只不过是在B树中一个再平常不过的上溢缺陷修复过程罢了
因此 非常易于理解
而将此前的红黑树 转换为对应的4阶B树呢
从提升变换的角度来看 也非常好理解
同样的 从变换之后的B树 到变换之后的红黑树
从提升变换的角度 也非常易于理解
总而言之 这样一个迂回的过程
要比我们试图直接去理解红黑树的调整过程反过来更为简明
概括来说 从红黑树的角度 对于这种情况
我们只需将节点p由红转黑 同时节点g由黑转红
而从B树的角度来看呢
则等效于对一个刚刚发生上溢的节点实施一次分裂操作
同时 居中的关键码被提升并加入到父节点之后将转为红色
请注意 经过如此调整之后
尽管上溢的这个节点的确得到了修复
然而故事未必就此结束 我们注意到在这里
居中的关键码将会被提升一层并加入至父节点中
所以到现在为止的效果
也可以等同的视作为在这个父节点中
插入了一个新的关键码
当然在g的左或右 至少应该有一个黑色的关键码
但遗憾的是 也有可能有一个红色的邻居
而后一种情况 则会导致在此处再次发生双红缺陷
不过好消息是 即便在这个位置上会再次出现双红缺陷
也不外乎是我们以上所介绍的两种情况
因此我们也大可套用以上所介绍的方法 来解决新的问题
而另一个好消息是 即便会出现这样的问题
问题所发生的位置 也会逐层的上升
因此 整个双红缺陷向上蔓延的过程迟早会终止
充其量不会高于树根
最后需要强调的一点是
尽管这一调整过程 从B树的角度来看
的确发生了拓扑结构的变化
但是从红黑树的角度来看
除了若干节点的颜色会发生变化
全树的拓扑连接关系并没有任何变化
也就是说 尽管重染色操作的次数可能会高达logn
但拓扑结构的变化 却依然控制在常数的范围
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试