std::map红黑树规则与修复

news/2025/3/19 9:42:31/文章来源:https://www.cnblogs.com/guoliushui/p/18780397

红黑树的规则

红黑树通过以下 ​5条规则 保持平衡:

  1. 颜色规则:每个节点是 ​红色 或 ​黑色
  2. 根节点规则:根节点必须是 ​黑色
  3. 叶子节点规则:叶子节点(NIL 节点,空节点)是 ​黑色
  4. 红色节点规则:红色节点的子节点必须是 ​黑色​(即不能有连续的红色节点)。
  5. 黑色高度规则:从任意节点到其所有叶子节点的路径上,黑色节点的数量相同(称为 ​黑高)。

红黑树的插入与修复

当插入一个新节点时,红黑树可能违反规则,需要通过 ​颜色调整 和 ​旋转 来修复。

4.1 插入步骤

  1. 按BST规则插入:新节点初始为 ​红色​(减少对黑高的影响)。
  2. 修复颜色冲突:如果父节点是红色,违反规则4,需要调整。

4.2 修复操作的3种情况

  • Case 1:叔叔节点是红色。
    • 将父节点和叔叔节点变为黑色,祖父节点变为红色。
  • Case 2:叔叔节点是黑色,且新节点是父节点的右子节点。
    • 对父节点左旋,转为 Case 3。
  • Case 3:叔叔节点是黑色,且新节点是父节点的左子节点。
    • 将父节点变黑,祖父节点变红,然后对祖父节点右旋。

 

举例:

以下是向 `std::map`(底层红黑树)中插入节点的详细过程示例。假设我们要依次插入键 `10`、`20`、`30`、`5`、`15`,并逐步展示红黑树的调整过程。

---

### **插入步骤详解**

#### **1. 插入第一个节点 `10`**
• **规则**:根节点必须是黑色。
• **操作**:直接插入为根节点,颜色设为黑色。
• **树结构**:
```plaintext
10(B)
/ \
NIL NIL
```

---

#### **2. 插入第二个节点 `20`**
• **插入规则**:新节点初始为红色。
• **操作**:`20` 作为 `10` 的右子节点插入,颜色为红色。
• **检查冲突**:父节点 `10` 是黑色,没有违反规则。
• **树结构**:
```plaintext
10(B)
/ \
NIL 20(R)
/ \
NIL NIL
```

---

#### **3. 插入第三个节点 `30`**
• **插入位置**:`30` 作为 `20` 的右子节点插入,颜色为红色。
• **冲突检查**:
• 父节点 `20(R)` 是红色,违反规则4(红色节点的子节点必须为黑色)。
• 叔叔节点是 `NIL`(黑色,属于规则3的叶子节点)。
• **修复操作**:进入 **Case 2 → Case 3**。

##### **Case 2:叔叔节点是黑色,新节点是父节点的右子节点**
• **操作**:对父节点 `20(R)` 左旋。
• **旋转后结构**:
```plaintext
10(B)
\
30(R)
/
20(R)
```

##### **Case 3:叔叔节点是黑色,新节点是父节点的左子节点**
• **操作**:
1. 将父节点 `30(R)` 变为黑色。
2. 将祖父节点 `10(B)` 变为红色。
3. 对祖父节点 `10(B)` 右旋。
• **最终结构**:
```plaintext
20(B)
/ \
10(R) 30(R)
```

---

#### **4. 插入第四个节点 `5`**
• **插入位置**:`5` 作为 `10(R)` 的左子节点插入,颜色为红色。
• **冲突检查**:
• 父节点 `10(R)` 是红色。
• 叔叔节点是 `30(R)`(红色)。
• **修复操作**:进入 **Case 1**。

##### **Case 1:叔叔节点是红色**
• **操作**:
1. 将父节点 `10(R)` 和叔叔节点 `30(R)` 变为黑色。
2. 将祖父节点 `20(B)` 变为红色。
• **最终结构**:
```plaintext
20(R)
/ \
10(B) 30(B)
/
5(R)
```

---

#### **5. 插入第五个节点 `15`**
• **插入位置**:`15` 作为 `10(B)` 的右子节点插入,颜色为红色。
• **冲突检查**:
• 父节点 `10(B)` 是黑色,没有冲突。
• **树结构**:
```plaintext
20(R)
/ \
10(B) 30(B)
/ \
5(R) 15(R)
```

---

### **最终红黑树验证**
1. **根节点为黑色**:当前根节点 `20` 是红色(违反规则2)→ **需要修复**。
• **修复**:将根节点强制设为黑色。
```plaintext
20(B)
/ \
10(R) 30(B)
/ \
5(R) 15(R)
```

2. **红色节点规则**:
• `10(R)` 的子节点 `5(R)` 和 `15(R)` 违反规则4(红色节点不能有红色子节点)→ **需要修复**。

3. **修复 `10(R)` 的子节点冲突**:
• 选择 `5(R)` 或 `15(R)` 进行修复,以 `5(R)` 为例:
◦ 父节点 `10(R)` 是红色,叔叔节点 `30(B)` 是黑色。
◦ 进入 **Case 2 → Case 3**。
◦ **最终结构**:
```plaintext
20(B)
/ \
15(B) 30(B)
/
10(R)
\
5(R)
```

---

### **关键点总结**
1. **插入新节点**:初始为红色,按BST规则插入。
2. **冲突修复**:
• **Case 1**:叔叔节点是红色 → 颜色翻转。
• **Case 2**:叔叔节点是黑色,且新节点是右子节点 → 左旋。
• **Case 3**:叔叔节点是黑色,且新节点是左子节点 → 右旋 + 颜色调整。
3. **根节点强制黑色**:最终确保根节点为黑色。

通过上述步骤,红黑树始终保持平衡,确保 `std::map` 的插入、删除和查找操作高效(`O(log n)`)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901382.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 开启 Javascript 内嵌的类型提示

默认情况,VSCode 的代码类型提示需要鼠标放置在函数名或者变量名上才出现,有没有觉得这样比较傻瓜~ VSCode 早在 1.60 版本就引入了内嵌提示配置,每次更新都没仔细看文档,感觉错过了很多的小惊喜啊。 默认的代码显示 你的编辑器代码是不是显示这个样子:开启内嵌的类型提示…

系统高可用的 10 条军规

前言 系统高可用是非常经典的问题,无论在面试,还是实际工作中,都经常会遇到。 这篇文章跟大家一起聊聊,保证系统高可用的10个小技巧,希望对你会有所帮助。1 冗余部署 场景:某电商大促期间,数据库主节点突然宕机,导致全站交易瘫痪。 问题:单节点部署的系统,一旦关键组…

phpStudy常见问题

问题一: 图中的错误提示显示,MySQL 无法切换到指定的目录,可能是文件或目录不存在 。以下是一些可能的原因和解决方法: 目录路径错误: 原因:MySQL 配置文件中设置的 datadir (数据存储目录)路径错误,或者该路径下的文件夹结构有变动,导致 MySQL 无法找到对应的目录。…

OpenHarmony 开源鸿蒙北向开发——hdc工具安装

​ hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备(或模拟器)进行连接调试通信。简单来讲,hdc 是 OpenHarmony 提供的用于开发人员调试硬件、应用的命令行工具,用…

DBeaver 常用个性化设置

SQL关键字大写 窗口 → 首选项 → 编辑器 → SQL编辑器 → SQL格式化 → 关键字大小写默认分页数量 窗口 → 首选项 → 编辑器 → 数据编辑器 → 数据集获取大小作者多数为原创文章 ( 部分转载已标出 ),目前资历尚浅文章内描述可能有误,对此造成的后果深表歉意,如有错误还望…

2023腾讯游戏安全竞赛-PC方向初赛复现

2023腾讯游戏安全竞赛-PC方向初赛复现 第一问 问题描述:在64位Windows10系统上运行contest.exe, 找到明文的信息,作为答案提交(1分) 直接运行程序,在contest.txt中拿到密文ImVkImx9JG12OGtlImV+,很像base64后的结果,但是直接解码得到的不是自然语言,整个exe程序也完全被…

如何选择合适的供应商协同平台,解决数据交互的安全性与高效性?

在当今竞争激烈的商业环境中,企业的供应链管理面临着诸多挑战。传统的供应商合作模式在信息沟通、流程效率等方面存在着明显的问题,这些问题不仅制约了企业的发展,也影响了整个供应链的竞争力,企业需要寻找供应商协同平台,实现企业与供应商之间的信息共享、业务协同和数据…

【深度好文】是时候重新评估您当前的MFT文件传输供应商了

随着文件传输需求的不断演变,更复杂的数据安全威胁的出现、⼈⼯智能等颠覆性技术、成本压⼒以及从医疗保健到⾦融再到供应链等⾏业⽇益严格的监管标准,企业可能需要重新评估其受管文件传输(MFT)供应商。本文将探讨推动企业更换MFT系统的因素,以及在评估潜在新MFT供应商时需…

Nginx错误处理与排查:运维人员的必备手册

前言:在日常的 Web 开发与运维工作中,Nginx 作为一款高性能的 Web 服务器和反向代理工具,被广泛应用于各种项目中。然而,即使是最优秀的工具也难免会遇到各种问题。Nginx 的报错信息虽然简洁,但往往让人摸不着头脑,尤其是对于新手来说,更是如此。而重定向配置,作为 Ngi…

RequestMapping

其中最关键的是path属性(等价于value),它决定了当前方法处理的请求路径,注意路径必须全局唯一,任何路径只能有一个方法进行处理,它是一个数组,也就是说此方法不仅仅可以只用于处理某一个请求路径,我们可以使用此方法处理多个请求路径: @RequestMapping({"/index&…

C#/.NET/.NET Core技术前沿周刊 | 第 30 期(2025年3.10-3.16)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

读DAMA数据管理知识体系指南24数据集成概念(下)

读DAMA数据管理知识体系指南24数据集成概念(下)1. 复制 1.1. 复制技术将分析和查询对主事务操作环境性能的影响降至最低 1.2. 复制解决方案通常监视数据集的更改日志,而不是数据集本身 1.3. 标准复制解决方案是准实时的,数据集的一个副本和另一个副本之间的更改有很小的延迟…