数据结构-红黑树

一、定义

红黑树是一种自平衡的二叉查找树,通过给结点标记红/黑颜色,并遵循特定规则,保证树的高度始终维持在 O(\log n),从而确保增删查改的时间复杂度稳定为 O(\log n)。

• 基础特性:满足二叉查找树的核心规则------左子树所有结点值 < 根结点值,右子树所有结点值 > 根结点值,左右子树也为二叉查找树。

二、红黑树的 5 条核心性质

  1. 每个结点要么是红色,要么是黑色。

  2. 根结点必须是黑色。

  3. 所有叶子结点(NIL 结点,空结点)都是黑色。

  4. 如果一个结点是红色,那么它的两个子结点必须都是黑色(不存在连续的红色结点)。

  5. 从任意一个结点到其所有后代叶子结点的每条路径上,包含相同数量的黑色结点(黑高一致)。

三、关键概念

  1. 黑高:从某结点到其叶子结点的路径上,黑色结点的数量(不包含该结点自身),叶子结点的黑高为 0。

  2. NIL 结点:红黑树的叶子结点并非空,而是用一个虚拟的黑色 NIL 结点表示,用于简化边界条件处理。

四、核心操作及失衡调整

红黑树插入、删除结点后可能破坏 5 条性质,需通过变色和旋转两种操作恢复平衡。

  1. 两种旋转操作(保证二叉查找树性质不变)

• 左旋:以某个结点为支点,将其右子树提升为新根,原根变为新根的左子树,新根的原左子树变为原根的右子树。

• 右旋:以某个结点为支点,将其左子树提升为新根,原根变为新根的右子树,新根的原右子树变为原根的左子树。

  1. 插入操作

• 新插入的结点默认标记为红色(减少对黑高的影响,降低调整复杂度)。

• 插入后根据叔父结点的颜色分情况处理:

◦ 叔父结点为红色:父结点、叔父结点变色为黑,祖父结点变色为红,再以祖父结点为当前结点继续向上调整。

◦ 叔父结点为黑色:根据结点位置(左左、左右、右右、右左),结合旋转 + 变色完成调整。

  1. 删除操作

• 优先删除度为 0 或 1 的结点,若为度为 2 的结点,用其前驱/后继结点值替换自身,再删除前驱/后继结点。

• 删除后根据兄弟结点的颜色及兄弟子结点的颜色分情况调整,核心是保证路径黑高不变。

五、红黑树 vs 平衡二叉树(AVL 树)

• 平衡标准:红黑树是近似平衡(黑高一致),AVL 树是严格平衡(左右子树高度差绝对值 ≤ 1)。

• 调整频率:红黑树插入、删除的调整频率更低,适合频繁增删的场景;AVL 树查询效率略高,适合频繁查询的场景。

• 应用场景:红黑树常用于 Java TreeMap、C++ STL map/set;AVL 树常用于数据库索引等对查询性能要求极高的场景。

相关推荐
炸膛坦客20 分钟前
嵌入式 - 数据结构与算法:(1-4)数据结构 - 单链表的两个核心缺点(引入循环/双向链表)
c语言·数据结构·链表
風清掦43 分钟前
【STM32学习笔记-12】Unix 时间戳、BKP 备份寄存器与 RTC 实时时钟
笔记·stm32·单片机·嵌入式硬件·学习·实时音视频·unix
Hesionberger1 小时前
LeetCode 78:子集生成全攻略
java·开发语言·数据结构·python·算法·leetcode·职场和发展
05候补工程师2 小时前
【408 应用层通关】DNS 域名解析负载博弈、HTTP 延迟计算与邮件协议全家桶详解
网络·经验分享·笔记·网络协议·计算机网络·http
码途漫谈2 小时前
Easy-Vibe高级开发篇阅读笔记(二)——CC教程之Claude Code MCP 完全指南
笔记·ai·开源·ai编程
上弦月-编程2 小时前
高效编程利器:转移表技术解析
c语言·开发语言·数据结构·算法·排序算法
薇茗2 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树2
c语言·数据结构·算法·二叉树
游乐码3 小时前
c#反射笔记二
笔记·c#
YaBingSec4 小时前
网络安全靶场WP:Grafana 任意文件读取漏洞(CVE-2021-43798)
android·笔记·安全·web安全·ssh·grafana
Wyc724094 小时前
数据结构1
数据结构