C++ RB_Tree

一、红黑树是什么?—— 带颜色标记的平衡二叉搜索树

红黑树是一种自平衡二叉搜索树,它在每个节点上增加了一个颜色属性(红色或黑色),通过对颜色的约束来确保树的大致平衡。这种平衡策略被称为 "弱平衡",相较于严格平衡的 AVL 树,它允许节点间的高度差不超过两倍,从而减少了旋转操作的频率,提升了动态数据操作的效率。

核心特性:

  • 二叉搜索树属性:左子树所有节点值小于根节点,右子树所有节点值大于根节点
  • 颜色标记机制:每个节点非红即黑,通过颜色调整维持平衡
  • 近似平衡:任何节点到其后代叶子节点的最长路径,不超过最短路径的 2 倍

二、红黑树的三大核心优势

1. 稳定的对数时间复杂度

  • 查找 / 插入 / 删除均保持 O (log n) 的时间复杂度,优于普通 BST 的 O (n) 最坏情况
  • 对比 AVL 树:虽然 AVL 树高度平衡(高度差≤1),但红黑树在频繁插入删除场景下,旋转次数更少,实际性能更优

2. 高效的动态数据操作

  • 插入和删除时仅需最多 2 次旋转(AVL 树可能需要 4 次)
  • 颜色重涂操作复杂度远低于树结构调整,适合处理频繁变更的数据集合

3. 广泛的实际应用

  • Java 集合框架:TreeMap 和 TreeSet 的底层实现
  • C++ STL:map、multimap 内部采用红黑树
  • Linux 内核:用于管理内存区域(vm_area_struct)
  • Nginx:实现对客户端请求的高效管理

三、红黑树的五条核心规则(必须严格遵守)

规则 1:节点颜色二值化

每个节点只能是红色或黑色,这是整个约束体系的基础。

规则 2:根节点恒定为黑色

确保树的最顶层始终为黑色,避免出现根节点为红色带来的平衡隐患。

规则 3:叶子节点全为黑色

这里的叶子节点指的是 NIL 空节点(外部节点),所有真实节点的叶子都指向这些黑色哨兵节点。

规则 4:红色节点必有黑色子节点

任何红色节点的左右子节点必须为黑色,防止出现 "红 - 红" 相邻的情况,这是维持平衡的关键约束。

规则 5:黑色高度统一

从任一节点到其所有后代叶子节点的路径上,包含的黑色节点数量必须相同。这个 "黑色高度" 的一致性,保证了树的最长路径不超过最短路径的 2 倍(因为红色节点不能连续出现,最长路径 = 黑色高度 + 红色节点数,而红色节点数≤黑色高度)。

比如我们看这课树

看起来好像是红黑树!!!

但是实际上我们把NULL节点画出来会发现每条路径上的黑色节点个数并不相同

所以它不是一棵二叉树

根据红黑树的五条性质可以保证

红黑树最长路径长度(节点数)不超过最短路径长度的 2 倍(含NULL节点)

四、红黑树的平衡维护机制

我们首先要明确

1. 红黑树插入的节点是黑色的还是红色的?

红色的 因为如果是黑色的那么这条路径上的黑色节点和其他路径节点数不同

这会影响其他所有路径相同的节点

但是如果插入节点是红色 只会影响这一条路径  

2.当我们需要平衡的时候 这棵树的parent节点是黑色还是红色?

红色的 因为我们插入节点是红色的时候 只会影响当下这一条路径

那么就只会违反红黑树的规则4 所以当需要平衡的时候par一定是红色的

那么这个时候grandparent一定是黑色的  不然插入的时侯

parent 和grandparent就违反规则4就不是红黑树了

当插入或删除节点导致颜色规则被破坏时,通过两种操作恢复平衡:

  1. 颜色重涂:改变节点颜色(红→黑或黑→红)
  2. 树旋转:分为左旋和右旋,调整树结构
  3. 下面以图的形成呈现

注意以下错误示范 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值