![![[Pasted image 20251003102658.png]]](https://i-blog.csdnimg.cn/direct/ead88892d3274e98b5f62b60c1f82351.png)
红黑树的定义
总体特征: 是一种扩展的平衡二叉树, 且同一节点的左右子树树高不会相差超过 2 倍。
具体特征:
颜色特征: 红黑树的结点具有颜色属性, 结点为红色或黑色。
根特征: 根结点永远是黑色。
外部特征: 扩展的外部叶子结点都是黑色结点。
内部特征: 红色结点的两个子结点都是黑结点, 即不允许出现两个连续的红结点互为父子。
深度特征: 任何结点到其子孙外部结点的每条简单路径都包含相同数目的黑色结点。
![![[Pasted image 20251003104036.png]]](https://i-blog.csdnimg.cn/direct/2963c8932fc64e4498a66131b23ee93e.png)
由根/外部特征可知:在从根节点通往任一节点的沿途,黑节点都不少于红节点。
除去根节点本身,沿途所经黑节点的总数称作该节点的黑深度(black depth),根节点的黑深度为0。
与树的定义有什么区别?树的根节点深度为1.
由深度特征可知:从任一结点通往其任一后代外部节点的沿途,黑结点的总数也一定相等。
除去外部节点, 沿途经过的黑色结点的个数即为该结点的黑高度(black height),外部节点的黑高度为0
根节点的黑高度数值上等于外部结点的黑深度
红黑树树高
红黑树是平衡二叉树吗?含有n个内部结点的红黑树,它的高度范围是多少?
对于有 n 个内部结点的红黑树, 那么 log2(n+1)≤H≤2log2(n+1)=O(log2n)log_{2}(n+1)≤ H ≤ 2log_{2}(n+1) = O(log_{2}n)log2(n+1)≤H≤2log2(n+1)=O(log2n)
又任意一棵红黑树都可以等价为一棵4阶B树,而4阶B树的高度h最大值为
h≤log[m2][n+12]≤log2(n+1)
h \le \log_{\left[ \frac{m}{2} \right]}\left[ \frac{n+1}{2} \right]\le \log_{2}(n+1)
h≤log[2m][2n+1]≤log2(n+1)
又红黑树中红色结点不可以连续出现
log2(n+1)≤H≤2h=2log2(n+1)=O(log2n)
log_{2}(n+1)≤ H ≤2h= 2log_{2}(n+1) = O(log_{2}n)
log2(n+1)≤H≤2h=2log2(n+1)=O(log2n)
所以说红黑树尽管不是严格的平衡二叉树, 但是其高度也是在 O(log(n))的, 可以保持适度平衡。
红黑树与 4 阶 B 树
红黑树可以等价的看做一棵 4 阶 B 树: 即将黑结点及其孩子中的红结点看成 B 树的内部结点的关键码, 那么显然, 这棵 B 树满足每个内部的结点数量为 1~3 个, 满足 4 阶 B 树的定义, 且黑色结点个数为对应的 B 树内部结点的个数, 红黑树的阶(黑色高度) 与 B 树的树高相等。
有 n 个内部结点的红黑树, 对应于有 n 个关键码的 4 阶 B 树, 因此红黑树的黑色树高范围与 B 树树高范围是一一对应的, 具体推导过程见查找部分 n 个关键码的 B 数的树高范围,这里给出结论:
此外, 红黑树的调整也与 4 阶 B 树的调整方式一一对应。
![![[Pasted image 20251003104238.png]]](https://i-blog.csdnimg.cn/direct/c8ad056d0f55467daef7dde7d47dbafa.png)
一个黑结点及其红色的孩子结点共同构成B树一个内部结点中的所有关键码, 一个B树结点中有且仅含有一个黑色关键字且红色关键字不能紧邻。
推论:红黑树的黑色树高等于其所对应的4阶B树的树高。
因此,n个内部结点的红黑树的黑色树高取值范围等于n个关键码的4阶B树树高的取值范围。
红黑树的更新操作
插入
- 插入结点的双亲结点为黑色;
- 插入结点的双亲结点为红色;
- 双亲结点的兄弟结点是黑色结点;
- 双亲结点的兄弟结点是红色结点;
插入结点的双亲结点为黑色
![![[Pasted image 20251003105315.png]]](https://i-blog.csdnimg.cn/direct/56853b76168944d1bfb1004bceff701b.png)
插入结点的双亲结点的兄弟结点是红色结点
![![[Pasted image 20251003105428.png]]](https://i-blog.csdnimg.cn/direct/0e66d4b403b447d2b898bc57d1e4cb30.png)
变为4阶B树
![![[Pasted image 20251003105505.png]]](https://i-blog.csdnimg.cn/direct/71e1d687f10949f8a824eaefdd1bd503.png)
上溢分裂
![![[Pasted image 20251003105550.png]]](https://i-blog.csdnimg.cn/direct/44f342958699429593bffce424f43e97.png)
![![[Pasted image 20251003105613.png]]](https://i-blog.csdnimg.cn/direct/8e17be13ebd24c50a3c8f44e621231dd.png)
拓扑结构变化最小
![![[Pasted image 20251003105642.png]]](https://i-blog.csdnimg.cn/direct/ecce6c9e615f4da988fa1ac017cc1146.png)
3+4重构法调整平衡二叉树
![![[Pasted image 20251003105722.png]]](https://i-blog.csdnimg.cn/direct/2c5a972fb3b64652aa0d85920f0d6816.png)
任意一棵平衡二叉树, 在进行插入或删除操作之前都应该是一棵平衡二叉树。
在进行插入删除操作之后, 若产生了不平衡情况, 不平衡结点一定位于该结点的双亲结
点或双亲结点以上的祖先节点。
任何一个需要被重平衡的结点都包含了两个子树。
![![[Pasted image 20251003105803.png]]](https://i-blog.csdnimg.cn/direct/c048cea107754acabd2b1276f670ef05.png)
插入的过程:
- 在对应位置插入新节点, 且置为红色。
- 若插入结点的父节点为黑色, 则算法结束; 否则, 进行双红调整。
双红修正的分类:
- 新增结点的叔父为黑色: 重构
- 新增结点的叔父也为红: 换色
插入结点的双亲结点是黑色结点
![![[Pasted image 20251003110010.png]]](https://i-blog.csdnimg.cn/direct/366f8709aa7b43c880428c518ef5e498.png)
插入结点的双亲结点的兄弟结点是黑色结点(双红修正-1)
![![[Pasted image 20251003110038.png]]](https://i-blog.csdnimg.cn/direct/2ba93fcb55b748e399082acb5ecc5ac6.png)
![![[Pasted image 20251003110053.png]]](https://i-blog.csdnimg.cn/direct/632ff731816c482e89b7c1fc8a18e44f.png)
![![[Pasted image 20251003110106.png]]](https://i-blog.csdnimg.cn/direct/8b77dd35290b49649d74c297ab63044c.png)
![![[Pasted image 20251003110118.png]]](https://i-blog.csdnimg.cn/direct/e04c04ce9f8b4c3d8fe78848ae2cb502.png)
插入结点的双亲结点的兄弟结点是红色结点(双红修正-2)
![![[Pasted image 20251003110143.png]]](https://i-blog.csdnimg.cn/direct/e6e029ccd206423ab58b5be265b4603b.png)
![![[Pasted image 20251003110152.png]]](https://i-blog.csdnimg.cn/direct/56c72f03dc1744de84dd978de4ff6bc0.png)
![![[Pasted image 20251003110206.png]]](https://i-blog.csdnimg.cn/direct/11c960246915485aab280d3fb3a24833.png)
相当于发生了一次结点的分裂, 关键字A向上分裂之后可能在上层同样引起双红调整的情况, 最坏的情况就是每一层都会发生上溢操作, 最后A传至根结点时, 根据红黑树的定义就需要将其强行变为黑色。
从B树的角度来说, 发生了上溢, 可能会向上传递;
从红黑树的角度来说, 仅仅发生了染色操作,可能会向上传递违法状态
![![[Pasted image 20251003110309.png]]](https://i-blog.csdnimg.cn/direct/f0037b0e8607463485d1799f4fd2b2bd.png)
插入操作总结:
![![[Pasted image 20251003103219.png]]](https://i-blog.csdnimg.cn/direct/73d0321d6599451caffa02e411cbbddd.png)
其中只有 RR-2 这一种情况, 修正次数可能是 O(logn)。
综上, 红黑树的插入操作一定可以在 O(logn)的时间内完成。
需要特别指出的是, 只有在 RR-1 修复时才需做 1~2 次旋转; 而且一旦旋转后, 修复过程必然随即完成。 故就全树拓扑结构而言, 每次插入后仅涉及常数次修正。
删除
- 删除结点为红色结点;
- 删除结点为黑色结点;
- 删除结点的孩子结点为红色;
- 删除结点的孩子结点都为黑色结点;
- 删除结点的兄弟结点的孩子结点有红色结点;
- 删除结点的双亲结点为红色结点;
- 删除结点的双亲结点, 兄弟结点以及兄弟结点的孩子结点皆为黑色;
- 删除结点的兄弟结点为红色结点;
删除方式:
若被删除结点有一个孩子是外部结点, 则直接删除; 否则将其与它的后继结点的数值进行交换后(注意不交换颜色) 再删除
删除结点可能产生的问题: 可能导致新节点到各外部结点简单路径上经过的黑色结点的数目不同。
删除结点为红色结点
![![[Pasted image 20251003111407.png]]](https://i-blog.csdnimg.cn/direct/fa639f9982df420da557563f662d3d96.png)
二叉排序树的删除操作,最终一定会转化为叶子结点或单分支结点的操作。
删除结点的孩子结点为红色
![![[Pasted image 20251003111433.png]]](https://i-blog.csdnimg.cn/direct/d2520c5d9fba429c98d3496436d42e98.png)
删除结点的孩子结点都为黑色结点
![![[Pasted image 20251003111449.png]]](https://i-blog.csdnimg.cn/direct/d2811389e24046b1a5b779e61f1ad764.png)
删除结点的兄弟结点的孩子结点(外甥/侄子结点)有红色结点(双黑修正-1)
![![[Pasted image 20251003111523.png]]](https://i-blog.csdnimg.cn/direct/186bea71246e4975a4feaceb65ac2676.png)
![![[Pasted image 20251003111536.png]]](https://i-blog.csdnimg.cn/direct/d850bc92d0484d67a96cc3af7c59d082.png)
![![[Pasted image 20251003111545.png]]](https://i-blog.csdnimg.cn/direct/4db07352f06b4e288f485cca564b9b93.png)
![![[Pasted image 20251003111557.png]]](https://i-blog.csdnimg.cn/direct/5939c0caec8043409ab8524eabc04031.png)
![![[Pasted image 20251003111610.png]]](https://i-blog.csdnimg.cn/direct/cd3a2cf16093447c9b22050556cb6a43.png)
![![[Pasted image 20251003111625.png]]](https://i-blog.csdnimg.cn/direct/acab00b928d14d40bf8a917876858e79.png)
删除结点的双亲结点为红色结点(双黑修正-2)
![![[Pasted image 20251003111646.png]]](https://i-blog.csdnimg.cn/direct/441ba69487304573ab42811cac3f04ff.png)
![![[Pasted image 20251003111653.png]]](https://i-blog.csdnimg.cn/direct/cfb871d1a6054db9b076152a514c519a.png)
![![[Pasted image 20251003111702.png]]](https://i-blog.csdnimg.cn/direct/d9ac86d944614ca09cc542b67b82bcfb.png)
![![[Pasted image 20251003111712.png]]](https://i-blog.csdnimg.cn/direct/ff993cc78bdb485ba4a2ceb89799bb61.png)
![![[Pasted image 20251003111721.png]]](https://i-blog.csdnimg.cn/direct/9e38f2a8debd401daedd578af104c775.png)
删除结点的双亲结点,兄弟结点以及兄弟结点的孩子结点皆为黑色(双黑修正-3)
![![[Pasted image 20251003111746.png]]](https://i-blog.csdnimg.cn/direct/fcd25deec71c4a07bec0ad6eae4c74e3.png)
![![[Pasted image 20251003111755.png]]](https://i-blog.csdnimg.cn/direct/45af85f2991c4e64b0cba1be99b4e775.png)
![![[Pasted image 20251003111805.png]]](https://i-blog.csdnimg.cn/direct/2338ba869d014a928a7f3acbe402970d.png)
![![[Pasted image 20251003111812.png]]](https://i-blog.csdnimg.cn/direct/f68ebe5bd4e342f082f32cd332024240.png)
![![[Pasted image 20251003111823.png]]](https://i-blog.csdnimg.cn/direct/0bf1a058f18646d0b8856a4f78382ac7.png)
此时, 对于局部来讲已经完成了删除操作, 而由于P所在的结点也发生了下溢, 所以删除操
作引发的下溢操作会沿着整棵树向上, 最多迭代O(logn)次必然结束。
删除结点的兄弟结点为红色结点(双黑修正-4)
![![[Pasted image 20251003111851.png]]](https://i-blog.csdnimg.cn/direct/efab4e34fc314025a166ace218808896.png)
![![[Pasted image 20251003111858.png]]](https://i-blog.csdnimg.cn/direct/916ee05eb3594f57bc94dc4c885f516c.png)
![![[Pasted image 20251003111905.png]]](https://i-blog.csdnimg.cn/direct/e47e8ba27fed4ac0ac46d11b71a83153.png)
![![[Pasted image 20251003111914.png]]](https://i-blog.csdnimg.cn/direct/b302137009e1449d955e5f8fd5ea0b15.png)
![![[Pasted image 20251003111940.png]]](https://i-blog.csdnimg.cn/direct/1e962d65b55e43ffb7463c1e01887e93.png)
两个意义: 被删除结点有了一个新的兄弟结点, 而且新的兄弟结点一定是黑色, 因此可以参考前面的情况。
此时的双亲结点P也变成了红色, 因此接下来只可能进行BB-1和BB-2两种立即完成调整的操作。
删除操作总结:
![![[Pasted image 20251003103934.png]]](https://i-blog.csdnimg.cn/direct/07401fb20c6347f3b3883c21c7d4e67b.png)
只有 BB-3 这一种情况, 修正次数是 O(logn)。
综上, 红黑树的删除操作一定可以在 O(logn)的时间内完成。
而且, 红黑树所有的情况下, 只要发生了旋转操作之后, 整个修正过程随即完成, 所以不论是双红修正还是双黑修正, 都只涉及常数次的拓扑排序调整操作。 因此, 在每次插入操作之后, 拓扑联接关系有所变化的结点绝不会超过常数个, 这也是与 AVL 树最重要的一个差异。
红黑树操作的拓扑结构稳定性: 变色操作的次数可能达到 O(logn), 而旋转操作的次数最多O(1)。
红黑树原理与操作详解

被折叠的 条评论
为什么被折叠?



