当前课程知识点:数据结构(下) > 第八章 高级搜索树(下) > (xa3)红黑树:插入 > 08XA3-2 双红缺陷
不妨假设 将要插入的是一个新的关键码e
而且我们也不妨就采用BST的常规插入算法
于是相应的也会生成一个新的末端节点x
不失一般性 如果不考察平凡的情况 那么x就不是树根
这意味着 它的父亲必然是存在的
于是接下来我们不妨简单的将x染为红色
这样做的好处是 红黑树的各条规则
能够尽可能的得到满足 尽管还不能全部满足
我们不妨来逐条核对一下
树根节点和所有的外部节点依然是黑的
在通往各个外部节点的路径上
黑节点的数目因为没有变化 所以依然保持全局的一致性
然而遗憾的是 第三条规则却未必满足
考察这个新插入的红色节点x
作为末端的叶节点 此时它的2个孩子都是外部节点
所以的确都是黑的
然而它的父节点颜色却不定
在这里为了帮助那些辨认颜色有困难的同学
我们不妨约定 圆形都对应于红色的节点
而方形则对应于黑色的节点
那么八角形呢 对应的就是颜色仍不能确定的节点
当然它必然有一种颜色 可能是黑 也可能是红
此时 节点x的父亲p 就是这样一个可黑可红的节点
如果它的确是黑的 那么第三条规则 也同时满足
整个插入操作即可成功返回
然而问题在于 节点p的确可能原本就是红的
比如这样一种情况
细心的你 可能已经注意到
我们这里对边的画法是不完全一样的
是的 凡是指向黑色节点或者至少颜色还不定的节点的边
我们都用实线来表示
而反过来所有指向红色节点的边 都用虚线表示
这种方式 可以更好的帮助我们思考和分析
因为这类虚边 在经过提升变换之后
都会变成是水平方向
是的 新插入的节点x与它的父亲p 同时为红色
这是红黑树的规则所禁止的
这样一种非法的情况 也因此称作双红缺陷 double-red
那么如何来修复这种双红缺陷呢
我们首先要考察x的祖父节点g
请注意此时的g 必然是存在的
否则作为树根的节点p是不可能为红色的
进一步的 作为红色节点p的父亲 节点g也必然是黑色的
此外 我们还需要考查g的另一个孩子u
形象的类比 相对于节点x 这个节点u是它的叔父uncle
当然节点u的颜色 也是不定的
因此以下我们就根据这个节点u的颜色分2种情况分别处理
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试