【11.6】索引--红黑树
BST的平衡问题:
- 理想状况:插入、删除、查找时间代价为O(logn )
- 输入9,4,2,6,7,15,12,21
- 输入2,4, 6,7, 9, 12,15, 21
一、红黑树定义:red-black tree, 简称RB-tree
红黑树:平衡的 扩充 二叉搜索树
- 颜色特征:结点是“红色” 或“黑色”;
- 根特征 :根结点永远是“黑色”的;
- 外部特征:扩充外部叶结点都是空的“黑色” 结点;
- 内部特征:“红色”结点的两个子结点都是 “黑色”的,丌允许两个连续的红色结点;
- 深度特征:任何结点到其子孙外部结点的每条 简单路径都包含相同数目的“黑色”结点
红黑树的阶
- 结点X的阶(rank,也称“黑色高度”)
- 从该结点到外部结点的黑色结点数量
- 不包括 X 结点本身,包括叶结点
- 外部结点的阶是零
- 根的阶称为该树的阶
二、 红黑树相关性质
- 红黑树是满二叉树 ,空叶结点也看作结点
- 阶为 k 的红黑树路径长度:最短是 k,最长是 2k。从根到叶的简单路径长度: 阶为 k 的红黑树树高最小是 k+1,最高是 2k+1
- 阶为k的红黑树的内部结点 最少是一棵完全满二叉树,内部结点数最少是 2^k-1
- n 个内部结点的红黑树树高
最大是
$ 2 log_{2} (n+1)+1 $
证明:
- 设红黑树的阶为 k,设红黑树的树高是 h。
- 由性质(2) 得 h <= 2k+1,则 k >= (h-1) / 2
- 由性质(3)得 n>=2^k–1,即n>=2(h-1)/2 –1
- 可得出 h <=
$ 2 log_{2} (n+1)+1 $
三、结点插入算法
- 先调用 BST 的插入算法
- 把新记录着色为红色
- 若父结点是黑色,则算法结束
- 否则,双红调整
3.1 插入算法调整 1:重构
情况1:新增结点 X 的叔父结点是黑色
每个结点的阶都保持原值,调整完成
4 种形式的结构调整
原则:保持 BST 的中序性质
3.2 插入算法调整 2:换色
情况 2:新增结点 X 的叔父结点也是红色
需要继续检查平衡
插入 4
- 情况 2 红红冲突 。 父和叔父也是红
- 父祖换色
情况 1 红红冲突。 叔父是黑 。 重构
四、结点删除算法
-
先调用 BST 的删除算法
-
待删除的结点有一个以上的外部空指针,则直接删除
-
否则在右子树中找到其后继结点进行值交换(着色不变)删除
-
v 是被删除的内结点, w 是被删外结点, X 是 w 的兄弟
-
如果v或者 X 是红色, 则把X标记为黑色即可 *否则, X 需要标记为双黑, 根据其兄弟结点 C 进行重构调整
4.1 根据双黑 X 的兄弟 C 进行调整
假设X是左子结点(若X为右孩子,则对称)
-
情况 1: C 是黑色,且子结点有红色
-
重构,完成操作
-
情况 2: C 是黑色, 且有两个黑子结点
-
换色
-
父结点 B 原为黑色,可能需要从 B 继续向上调整
-
情况3: C是红色
-
转换状态
-
C 转为父结点,调整为情况 1 或 2 继续处理
4.1.1 情况 1(a) 重构:侄子红结点八字
- 将兄弟结点 C 提上去
- C 继承原父结点的颜色
- 然后把B着为黑色,D 着为黑色,其他颜色不变即可
4.1.2 情况 1(b) 重构:侄子红结点同边顺
- 将 D 结点旋转为 C 结点的父结点,D 继承原 子根 B 的颜色,B 着为黑色
4.1.3 情况 2:兄弟是黑色, 且有两个黑子结点
- 把 C 着红色, B 着黑色
- 如果 B 原为红色,则算法结束
- 否则,对 B 继续作“双黑”调整
4.1.4 情况 3: 兄弟 C 是红色
- 旋转
- X 结点仍是“双黑”结点,转化为前面2种情况
4.1.5 例子
删除 90
- 当前结点变为 80 的右黑叶结点
- C 是黑色, 且有两个黑色子结点:情况 2
情况 2 换色
删除 70
红结点,不要调整
删除 80
- 当前结点 X 变为 65 的右黑叶结点 * C 是红色:情况 3 状态转换
删除 80(调整)
- C 是黑色,且左黑、右红:情况 1(b) 重构
完成调整
4.2 删除操作时间代价
- 其平均和最差检索 O(log2 n)
- 自底向根的方向调整
- 红黑树构造
- (数据,左指针,右指针,颜色,父指针)
- 自顶向下的递归插入/删除调整方
- (数据,左指针,右指针,颜色)
- 若非递归,则记录回溯路径
4.3 从 Red-Black-Tree 到 2-3-4 树
-
假设将一棵红黑树的每个红结点“吸收”到他的黑色父 结点中,来让红结点的子女变为黑色父结点的子女(忽 略关键字的变化)
-
当一个黑结点的所有红色子女都被吸收后, 其可能的度是多少?
-
2、3、4 即成为一棵 2-3-4 树(阶为 4 的 B 树)
-
此结果树的叶子深度怎样? 叶结点等高
参考资料
北京大学 《数据结构与算法》 张铭、赵海燕、宋国杰、黄骏、邹磊、陈斌、王腾
这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn