【学习笔记】红黑树
红黑树是一种通过“颜色标记旋转/变色”维持近似平衡的二叉查找树能保证插入、删除、查询的最坏时间复杂度稳定在O(log n)是兼顾性能与实现复杂度的经典数据结构广泛应用于编程语言标准库、操作系统内核等场景。一、红黑树的起源从对称二叉B树到红黑命名红黑树的发展并非一蹴而就其演进过程节点如下1972年初始发明德国计算机科学家Rudolf Bayer在其论文中提出了一种名为“对称二叉B树Symmetric Binary B-tree”的数据结构这是红黑树的雏形。这种树本质是B树的一种特殊order-4情况能保证从根到叶的所有路径包含相同数量的节点实现完美平衡但它并非二叉查找树仅作为平衡树的早期探索。1978年正式命名与优化Leonidas J. Guibas与Robert Sedgewick在论文《A Dichromatic Framework for Balanced Trees》中基于对称二叉B树推导出红黑树并正式命名。关于“红黑”颜色的选择有两种权威说法一是当时作者在施乐帕洛阿尔托研究中心Xerox PARC使用的彩色激光打印机红色打印效果最佳二是作者常用红黑钢笔绘制树形图因此得名。后续优化迭代1993年Arne Andersson提出右倾树思想简化了红黑树的插入与删除操作1999年Chris Okasaki提出纯函数式插入实现将平衡调整的非平衡情况简化为4种2001年Cormen等人在《算法导论》中将原始插入算法的8种非平衡情况优化为6种2008年Robert Sedgewick提出左倾红黑树进一步简化实现将插入算法从最初的46行Java代码缩减至33行。二、红黑树二叉查找树颜色约束红黑树的本质是“二叉查找树BST 1位颜色标记”所有节点额外携带一个颜色属性红色或黑色并通过5条核心性质维持平衡这5条性质是红黑树的灵魂每个节点要么是红色要么是黑色根节点必须是黑色所有叶子节点NIL节点空节点都是黑色红黑树的叶子并非实际存储数据的节点而是用于简化边界判断的空节点所有空节点统一为黑色如果一个节点是红色那么它的两个子节点必须是黑色不允许出现两个连续的红色节点对于任意一个节点从该节点到其所有后代叶子节点的所有路径包含的黑色节点数量相同称为“黑高相等”黑高定义为从节点到叶子节点的黑色节点数不包含当前节点本身补充黑高的定义是理解红黑树平衡的核心。红黑树的高度h ≤ 2log(n1)因此所有操作的时间复杂度均为O(log n)——这是红黑树近似平衡的核心数学依据也是其优于普通二叉查找树最坏退化为链表O(n)复杂度的关键。三、旋转与变色红黑树的平衡维持依赖两种基础操作旋转左旋、右旋和变色。1 旋转不改变BST性质旋转的核心目的是调整树的结构不改变节点的键值大小关系即维持BST性质仅改变节点的父子关系分为左旋和右旋两种左旋以指定节点为支点将其右子节点提升为新的父节点原支点变为新父节点的左子节点新父节点的原左子节点变为原支点的右子节点。左旋操作可保持BST性质且时间复杂度为O(1)仅调整指针。右旋与左旋对称以指定节点为支点将其左子节点提升为新的父节点原支点变为新父节点的右子节点新父节点的原右子节点变为原支点的左子节点同样保持BST性质时间复杂度O(1)。2 插入分5种情况修复平衡插入操作遵循“先按BST规则插入再着色为红色最后修复平衡”的逻辑——之所以着色为红色是因为插入黑色节点会直接违反性质5黑高不一致修复难度极大而插入红色节点仅可能违反性质2根为黑或性质4连续红节点修复更简单。设新插入节点为N父节点为P祖父节点为G叔叔节点为UP的兄弟节点修复过程分5种情况情况1N是根节点 → 将N改为黑色修复性质2# 操作前 N (根) # 操作后 (修复性质2) ⚫ N (根)情况2P是黑色 → 无违反性质无需修复⚫ G / ⚫ P -- 父节点为黑色合法 / N -- 新插入节点情况3P是红色U也是红色 → 将P和U改为黑色G改为红色将G视为新的N递归检查# 操作前 ⚫ G / \ P U -- P和U都是红色违反性质4 / N -- 新节点 # 操作后 ( 变色) G -- 变为新N需递归检查 / \ ⚫ P ⚫ U -- 父子红冲突解除 / N情况4P是红色U是黑色且N是P的右子节点、P是G的左子节点 → 以P为支点左旋将P视为新的N转入情况5# 操作前 (三叉戟形态) ⚫ G / P \ N -- N是右子无法直接右旋 # 操作后 (↺ 左旋 P) ⚫ G / N -- 转化为情况5的形态 / P情况 4 镜像P 是 G 的右子N 是 P 的左子 →右旋 P转入情况 5 镜像。情况5P是红色U是黑色且N是P的左子节点、P是G的左子节点 → 将P改为黑色G改为红色以G为支点右旋镜像情况同理左右旋相反# 操作前 (连续左红) ⚫ G / P / N # 操作后 ( 变色 ↻ 右旋 G) ⚫ P -- 提升为根染黑 / \ N G -- 祖父降级染红情况 5 镜像P 是 G 的右子N 是 P 的右子 →P 染黑G 染红左旋 G。3 删除删除操作比插入更复杂核心逻辑是“先按BST规则删除节点再修复被破坏的红黑性质”标准BST删除若被删除节点D有两个非NIL子节点先找到其右子树的最小节点后继节点用后继节点的值替换D的值再删除后继节点转化为删除至多一个子节点的节点平衡修复设D的子节点为C至多一个X 替换 D 后需要修复的节点承载 “黑高缺失”分三种情况D是红色 → 直接删除用C替换D无性质破坏# 操作前 ⚫ P / \ D ⚫ S / ⚫ C (或 Nil) # 操作后 (用 C 替换 D) ⚫ P / \ ⚫ C ⚫ SD是黑色C是红色 → 用C替换D将C改为黑色修复性质5# 操作前 ⚫ P / \ ⚫ D ⚫ S / C # 操作后 (替换 变色) ⚫ P / \ ⚫ C ⚫ S -- C 由红变黑补回黑高D和C都是黑色 → 删除后经过D的路径黑高减少1违反性质5需根据D的兄弟节点S的颜色及S的子节点颜色分多种子情况通过变色和旋转传递“双重黑色”直至恢复平衡以 X 是 P 的左子为例镜像同理子情况 1S 是红色必然导致 P 为黑思路先旋转将 S 染黑、P 染红把问题转化为 S 是黑色的子情况。# 操作前 ⚫ P / \ ⚫ X S / \ ⚫ SL ⚫ SR # 操作后 (以 P 为支点 ↺ 左旋) S / \ ⚫ P ⚫ SR / \ ⚫ X ⚫ SL此时 S 变为黑色问题转化为子情况 2/3/4继续处理 X子情况 2S 是黑色且 SL、SR 都是黑色思路将 S 染红把 “双重黑色” 向上传递给 PP 变为新的 X# 操作前 ⚫/ P / \ ⚫ X ⚫ S -- S 是黑 / \ ⚫ SL ⚫ SR -- 两个子都是黑 # 操作后 ( 变色) ⚫/ P -- P 变为新 X继续向上 / \ ⚫ X S -- S 变红X 的黑高补回 / \ ⚫ SL ⚫ SR如果 P 原来是红色染黑后结束修复如果 P 原来是黑色P 变为新的 “双重黑色”继续向上递归。子情况 3S 是黑色SL 是红色SR 是黑色“左红右黑”思路先右旋 S将 SL 染黑、S 染红转化为子情况 4# 操作前 ⚫/ P / \ ⚫ X ⚫ S / \ SL ⚫ SR -- 左红右黑 # 操作后 (以 S 为支点 ↻ 右旋) ⚫/ P / \ ⚫ X ⚫ SL / \ Nil S -- 变为情况 4 的形态 \ ⚫ SR子情况 4S 是黑色SR 是红色“右红”思路左旋 P将 S 染黑、P 染红、SR 染黑彻底修复黑高# 操作前 /⚫ P / \ ⚫ X ⚫ S / \ ⚫ SL SR -- 右子是红 # 操作后 (以 P 为支点 ↺ 左旋 变色) ⚫ S / \ P ⚫ SR / \ ⚫ X ⚫ SL此时 X 的 “双重黑色” 被消解所有路径黑高恢复一致镜像X 是 P 的右子所有子情况完全对称1 镜像S 是红 → 右旋 PS 变黑、P 变红2 镜像S 及子都黑 → S 变红P 变为新 X3 镜像S 黑、SR 红、SL 黑 → 左旋 SSR 变黑、S 变红转 44 镜像S 黑、SL 红 → 右旋 PS 变黑、P 变红、SL 变黑删除操作的非平衡情况更多但目标始终是恢复“黑高相等”和“无连续红节点”两个核心约束四、红黑树的实际应用编程语言标准库C STLstd::map、std::multimap、std::set、std::multisetGCC版本底层均为红黑树实现用于维持有序数据结构支持高效范围查询Java集合框架TreeMap、TreeSet底层基于红黑树支持subMap()等范围查询方法区别于HashMap的无序特性HashMap查询O(1)TreeMap查询O(log n)按需选择操作系统内核Linux内核CFS调度器用红黑树管理进程的vruntime虚拟运行时间可在O(log n)时间内找到vruntime最小的进程实现高效调度Linux内核tcp_congestion_control模块用红黑树管理拥塞控制算法优化网络传输性能内存数据库与缓存Redis早期ZSET有序集合用红黑树实现后改为跳跃表但红黑树仍用于内部事件调度如定时任务MySQL执行ORDER BY时若内存充足会用红黑树排序中间结果提升排序效率文件系统Ext4文件系统用红黑树存储目录项dentry加速文件查找——因目录项通常在内存中数据规模适中红黑树比B树更节省内存、操作更高效网络调度Nginx定时器管理用红黑树组织定时事件如连接超时检测相比最小堆红黑树的删除操作更高效堆删除需O(n)查找红黑树O(log n)五、总结红黑树的核心优势的是“平衡与复杂度的折中”相比AVL树严格平衡旋转次数多红黑树插入/删除时旋转次数更少适合频繁修改的场景相比普通BST红黑树能保证稳定的O(log n)时间复杂度避免性能退化相比哈希表红黑树支持有序遍历和范围查询填补了有序场景的空白。参考内容出处红黑树起源与演进维基百科Red–black tree、CSDN博客红黑树详解:发明、特性、应用与调试红黑树核心性质与旋转操作McGill大学计算机科学系讲义COMP251: Red-black trees、TUM慕尼黑工业大学算法课程讲义7.2 Red Black Trees插入/删除算法《算法导论》Cormen et al., 2002、CSDN博客红黑树-带源码

相关新闻

小白友好:PyTorch 2.9镜像环境配置,避免常见坑点

小白友好:PyTorch 2.9镜像环境配置,避免常见坑点

小白友好:PyTorch 2.9镜像环境配置,避免常见坑点 你是不是刚接触深度学习,想用PyTorch跑个模型,结果被环境配置搞得头大?驱动版本不对、CUDA装不上、依赖包冲突……这些坑我当年也踩过无数次。现在好了,有…

2026/7/2 20:05:41 阅读更多 →
【力扣hot100|从0-1的开始】哈希

【力扣hot100|从0-1的开始】哈希

哈希 理解核心思想哈希的本质:用空间换时间。具体体现如下 正常查找:数组查找:O(n) 哈希查找:HashMap查找:O(1) 流程:key → hash函数 → hash值 → 数组下标 例: key "abc"ha…

2026/5/17 9:18:40 阅读更多 →
Tao-8k数据库智能应用实战:结合MySQL的数据分析与报告生成

Tao-8k数据库智能应用实战:结合MySQL的数据分析与报告生成

Tao-8k数据库智能应用实战:结合MySQL的数据分析与报告生成 你是不是也经历过这样的场景?每天上班第一件事,就是打开数据库管理工具,写一堆复杂的SQL,从海量数据里捞出几个关键指标,然后复制粘贴到Excel&am…

2026/7/3 4:45:12 阅读更多 →

最新新闻

KlakSpout完全指南:如何在Unity中实现零延迟跨应用视频流共享

KlakSpout完全指南:如何在Unity中实现零延迟跨应用视频流共享

KlakSpout完全指南:如何在Unity中实现零延迟跨应用视频流共享 【免费下载链接】KlakSpout Spout plugin for Unity 项目地址: https://gitcode.com/gh_mirrors/kl/KlakSpout 想要在Unity中实现零延迟的视频流共享吗?KlakSpout正是您需要的终极解决…

2026/7/4 5:58:40 阅读更多 →
Tidy.js:JavaScript数据清洗革命!用dplyr思维轻松处理数组数据

Tidy.js:JavaScript数据清洗革命!用dplyr思维轻松处理数组数据

Tidy.js:JavaScript数据清洗革命!用dplyr思维轻松处理数组数据 【免费下载链接】tidy Tidy up your data with JavaScript, inspired by dplyr and the tidyverse 项目地址: https://gitcode.com/gh_mirrors/ti/tidy 还在为JavaScript中复杂的数据…

2026/7/4 5:56:40 阅读更多 →
Mongood核心功能全解析:从数据编辑到慢查询分析的完整指南

Mongood核心功能全解析:从数据编辑到慢查询分析的完整指南

Mongood核心功能全解析:从数据编辑到慢查询分析的完整指南 【免费下载链接】mongood A MongoDB GUI with Fluent Design 项目地址: https://gitcode.com/gh_mirrors/mo/mongood Mongood是一款采用Fluent Design设计的MongoDB GUI工具,为数据库管理…

2026/7/4 5:56:40 阅读更多 →
Clang ASTMatcher高级应用:clang-tutor中的模式匹配技巧

Clang ASTMatcher高级应用:clang-tutor中的模式匹配技巧

Clang ASTMatcher高级应用:clang-tutor中的模式匹配技巧 【免费下载链接】clang-tutor A collection of out-of-tree Clang plugins for teaching and learning 项目地址: https://gitcode.com/gh_mirrors/cl/clang-tutor Clang-tutor是一个面向教学和学习的…

2026/7/4 5:54:40 阅读更多 →
nRF52832 BLE SoC芯片特性解析与低功耗设计实践

nRF52832 BLE SoC芯片特性解析与低功耗设计实践

1. nRF52832芯片概述nRF52832是Nordic Semiconductor推出的新一代蓝牙低功耗(BLE)系统级芯片(SoC),作为nRF51822的升级版本,它在性能、功耗和功能方面都有显著提升。这款芯片采用Cortex-M4F内核,运行频率高达64MHz,配备512KB Flas…

2026/7/4 5:52:40 阅读更多 →
Flutter游戏网络功能终极指南:如何快速实现排行榜与成就系统

Flutter游戏网络功能终极指南:如何快速实现排行榜与成就系统

Flutter游戏网络功能终极指南:如何快速实现排行榜与成就系统 【免费下载链接】games Home of the Flutter Casual Games Toolkit and other Flutter gaming templates 项目地址: https://gitcode.com/gh_mirrors/games8/games Flutter游戏开发中,…

2026/7/4 5:52:39 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻