news 2026/8/21 23:39:34

c++红黑树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++红黑树

一、为什么需要红黑树?

在编程中,我们经常需要一个动态维护有序数据的结构。比如:

  • std::mapstd::set的底层实现
  • Linux内核的进程调度器
  • 数据库的索引结构

如果使用普通的二叉搜索树(BST),极端情况下会退化成链表(如插入有序数据),导致查找效率从O(log n)降为O(n)。为了解决这个问题,红黑树(Red-Black Tree)应运而生。

二、红黑树的核心思想

红黑树是一种自平衡的二叉搜索树,它通过以下规则实现近似平衡:

红黑树的5大规则

  1. 每个节点非红即黑
  2. 根节点必须是黑色
  3. 红色节点的子节点必须是黑色(不能出现连续的红色)
  4. 从任意节点到其空子节点的路径上,黑色节点的数量必须相同
  5. 每个叶子节点(空节点)是黑色

为什么这些规则能保证效率?

  • 最长路径 ≤ 2 × 最短路径
    例如,如果最短路径有k个节点,最长路径最多有2k个节点。这确保了红黑树的高度始终在O(log n)范围内。

三、红黑树的插入操作详解

插入新节点时,红黑树需要通过变色 + 旋转维持平衡。以下是典型场景:

情况1:父节点是黑色

  • 直接插入即可,无需调整。

情况2:父节点是红色

此时需要根据叔叔节点的颜色进行处理:

子情况1:叔叔是红色
  • 操作:父节点、叔节点变黑,祖父节点变红,并继续向上处理。
祖父(黑) → 父(红) → 当前(红) 叔(红)
子情况2:叔叔是黑色或不存在

需要通过旋转调整:

  • LL型(当前节点在左子树的左子树):右单旋 + 变色
  • RR型(当前节点在右子树的右子树):左单旋 + 变色
  • LR型(当前节点在左子树的右子树):左右双旋 + 变色
  • RL型(当前节点在右子树的左子树):右左双旋 + 变色

四、红黑树的代码实现

enum Color { RED, BLACK }; template <typename K, typename V> struct RBTreeNode { RBTreeNode* left; RBTreeNode* right; RBTreeNode* parent; std::pair<K, V> kv; Color color; RBTreeNode(const K& key, const V& value) : left(nullptr), right(nullptr), parent(nullptr), kv(key, value), color(RED) {} }; template <typename K, typename V> class RBTree { public: void insert(const K& key, const V& value) { // 二叉搜索树插入逻辑 // ... // 插入后调整平衡 fixInsert(newNode); } private: void fixInsert(RBTreeNode<K, V>* node) { while (node->parent && node->parent->color == RED) { // 处理四种情况 // ... } root->color = BLACK; } RBTreeNode<K, V>* root; };

五、红黑树的应用场景

1.C++ STL容器

  • std::mapstd::set默认使用红黑树实现(C++11)。
  • 插入/删除操作时间复杂度为O(log n)

2.Linux内核

  • 完全公平调度器(CFS)使用红黑树管理进程队列。
  • 快速找到下一个要运行的进程。

3.数据库索引

  • MySQL 的 InnoDB 引擎使用 B+ 树(红黑树的扩展)作为索引结构。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 14:18:10

19、量子计算在机器学习与电路优化中的应用

量子计算在机器学习与电路优化中的应用 1. 排队论模型在量子电路中的应用 在某些场景下,会使用利特尔法则(Little’s law)再次计算整个网络的时间,得出 $\overline{T} = \frac{K}{\lambda} = 3.33$ 。这一理论下限为 3,证实了在乘法器的情况下,实际获得的 5 层 SWAP 电…

作者头像 李华
网站建设 2026/8/20 18:35:54

EmotiVoice支持哪些语言和语调?全面功能特性一览

EmotiVoice 支持哪些语言和语调&#xff1f;功能特性深度解析 在虚拟主播直播中突然“情绪上头”&#xff0c;游戏角色因剧情转折而声音颤抖&#xff0c;或是你的语音助手用带着笑意的语气说“早安”——这些曾属于科幻场景的细节&#xff0c;正随着新一代语音合成技术的突破逐…

作者头像 李华
网站建设 2026/8/21 15:44:20

Qt实现多语言原理和实践详解

目录 1.简介 2.QTranslator说明 3.语言文件制作 3.1.前置条件 3.2.完整制作流程 4.多语言示例 5.关键注意事项 5.1.tr()的正确使用 5.2.将 .qm 嵌入资源文件&#xff08;避免外置&#xff09; 5.3.翻译 Qt 内置控件文本&#xff08;如 QMessageBox&#xff09; 5.4.…

作者头像 李华
网站建设 2026/8/19 18:53:14

基于Python的外卖配送分析与可视化系统的设计与实现_35k9z86f--论文

文章目录系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 基于Python的外卖配送分析与可视化系统的设计与实现_35k9z86f–论文 项目简介…

作者头像 李华
网站建设 2026/8/20 23:17:42

2、探索 Linux API 与 Kylix 开发的奥秘

探索 Linux API 与 Kylix 开发的奥秘 1. Linux 简介与发展历程 Linux 是一款强大的操作系统,它的起源颇具传奇色彩。1991 年 10 月,年轻的大学生 Linus Torvalds 在 comp.os.minux 新闻组发布消息,称自己正在为 386(486) AT 克隆机开发一个免费的操作系统,当时这只是他的…

作者头像 李华
网站建设 2026/8/21 11:55:11

基于EmotiVoice的高表现力语音合成实战指南

基于EmotiVoice的高表现力语音合成实战指南 在智能语音内容爆炸式增长的今天&#xff0c;用户早已不再满足于“能说话”的机器。无论是短视频中的情绪化旁白、游戏里富有张力的NPC对话&#xff0c;还是虚拟主播实时互动时的语气起伏&#xff0c;大家期待的是有情感、有个性、像…

作者头像 李华