第八节:红黑树(初阶)

news2025/3/16 10:01:53

【本节要点】

  • 红黑树概念
  • 红黑树性质
  • 红黑树结点定义
  • 红黑树结构
  • 红黑树插入操作的分析

一、红黑树的概念与性质

1.1 红黑树的概念

红黑树 ,是一种 二叉搜索树 ,但 在每个结点上增加一个存储位表示结点的颜色,可以是 Red和 Black 。 通过对 任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路 径会比其他路径长出俩倍 ,因而是 接近平衡 的。
红黑树构造:
 
          [10(黑)] 
          /        \
       [5(红)]     [20(黑)]
      /     \       /     \
    [3(黑)] [8(黑)] [15(红)] [25(红)]
     /  \    /  \     /  \    /  \
   NIL NIL  NIL NIL  NIL NIL NIL NIL

1.2 红黑树的性质 

  • 1. 每个结点不是红色就是黑色
  • 2. 根节点是黑色的 
  • 3. 如果一个节点是红色的,则它的两个孩子结点是黑色的 
  • 4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 
  • 5. 每个叶子结点都是黑色(此处的叶子结点指的是空结点)

 以上五点性质可以保证:其最长路径中节点个数不会超过最短路径节点个数的两倍。

 二、红黑树结点定义

// 结点的颜色
enum Colour
{
	RED,
	BLACK,
};
 
// 红黑树结点的定义
template<class K, class V>
struct RBTreeNode
{
	pair<K, V> _kv;            // 结点的键值对
	RBTreeNode<K, V>* _left;   // 结点的左孩子
	RBTreeNode<K, V>* _right;  // 结点的右孩子
	RBTreeNode<K, V>* _parent; // 结点的双亲(红黑树需要旋转,为了实现简单所以给出该结点)
	Colour _col;               // 结点的颜色

    // 结点的构造函数
	RBTreeNode(const pair<K, V>& kv)
		:_kv(kv)
		, _left(nullptr)
		, _right(nullptr)
		, _parent(nullptr)
		, _col(RED)
	{}
};

注意:红黑树定义结点时,默认结点颜色为红色,这一设计选择直接增加红黑树的平衡维护效率和整体性能,大大减少时间复杂度。

三、红黑树的结构

// 以本数组为例
num[3, 5, 8, 10, 15, 20, 25]
红黑树构造:
 
          [10(黑)] 
          /        \
       [5(红)]     [20(黑)]
      /     \       /     \
    [3(黑)] [8(黑)] [15(红)] [25(红)]
     /  \    /  \     /  \    /  \
   NIL NIL  NIL NIL  NIL NIL NIL NIL

图示说明

  1. 根结点标记:根结点 10 为黑色,符合性质2(根结点必黑)

  2. 红色结点规则:红色结点 51525 的子结点均为黑色,满足性质3(红色结点不连续)

  3. 黑高一致性验证:从根结点到任意 NIL 的路径黑色结点数均为 2

  4. NIL结点处理:所有叶子结点显式标记为 NIL(黑色),符合性质5

  5. 最长/最短路径对比

    路径类型示例路径结点数比例
    最短路径10→20→NIL21:1
    最长路径10→5→3→NIL31.5:1
    理论极限红黑交替路径(未出现)≤4≤2:1

 四、红黑树的插入操作

                              [开始插入新结点Z]
                                      │
                                      ▼
                       ┌─────────执行标准BST插入─────────┐
                       │                                │
                       ▼                                ▼
                  [Z设为红色]                   [保持BST性质]
                       │
                       ▼
             ┌─────父结点P是否为红色?─────┐
             │                            │
             ▼ (是)                       ▼ (否)
    [存在双红冲突需处理]               [插入完成]
             │
             ▼
   ┌────叔结点U的颜色?────┐
   │                      │
   ▼ (红色)               ▼ (黑色/NIL)
[Case1: 颜色翻转]     [判断冲突结构类型]
   │                      │
   ▼                      ├─────────────────────────┐
[将P、U设为黑色]           ▼                         ▼
   │               [Z-P-G呈三角型]            [Z-P-G呈直线型]
   ▼                      │                         │
[将G设为红色]        [Case2: 旋转父结点]      [Case3: 旋转祖父结点]
   │                      │                         │
   ▼                      ▼                         ▼
[以G为新Z向上回溯]   [转为直线型冲突]         [交换颜色并旋转]
                                           
                                                    │
                                                    ▼
                                                [调整完成]
                                                    │
                                                    ▼
                                           [最终确保根结点为黑]

4.1 基本BST插入阶段

  • 插入位置遵循二叉搜索树规则

  • 新结点初始颜色必须为红色(最小化规则破坏)

4.2 冲突检测阶段

  • 要素1:父结点状态判断
  • 要素2:叔结点颜色判定
  • 要素3:冲突结构类型识别

4.3  典型场景演练

场景1:叔结点为红(Case1)

         G(黑)                 G(红)
        /   \     颜色翻转     /   \
      P(红) U(红)  →       P(黑) U(黑)
      /                   /
    Z(红)              Z(红)

检测要点

  • 确认U存在且为红

  • 将冲突标记上移给G

  • 继续以G作为新Z向上检测

场景2:叔结点为黑-三角型(Case2)

     G(黑)            G(黑)
    /               /
  P(红)   →      Z(红)
    \           /
    Z(红)     P(红)

检测要点

  • 判断Z是P的右子结点

  • 识别为三角型冲突

  • 转换为直线型处理

场景3:叔结点为黑-直线型(Case3)

      G(黑)             P(黑)
     /               /   \
   P(红)   →      Z(红) G(红)
   /
 Z(红)

检测要点

  • 确认Z是P的左子结点

  • 直接触发祖父旋转

  • 完成颜色交换

 4.4 总结

冲突检测阶段通过三级条件筛选(父结点状态→叔结点颜色→冲突结构类型),将复杂的平衡问题分解为可控的局部操作。这种分层检测机制:

  1. 确保90%以上的插入操作只需1次检测即可完成
  2. 将最坏情况的时间复杂度严格控制在O(log n)
  3. 为后续的旋转/颜色调整提供精准的操作依据

该设计体现了红黑树"以检测换计算,以分类求高效"的核心优化思想,是其能在大规模数据场景下保持卓越性能的关键所在。


以上就是红黑树初阶知识的了解,接下来我会继续更新红黑树进阶红黑树的模拟实现、使用红黑树底层对map和set容器的模拟实现。制作不易,请大家多多点赞收藏啦!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Webpack vs Rollup vs Parcel:构建工具深度对比

文章目录 1. 核心特性对比1.1 功能定位1.2 技术架构对比 2. 配置与使用2.1 Webpack 配置示例2.2 Rollup 配置示例2.3 Parcel 使用示例 3. 性能对比3.1 构建速度3.2 输出质量 4. 生态系统4.1 插件生态4.2 学习曲线 5. 适用场景分析5.1 Webpack 适用场景5.2 Rollup 适用场景5.3 P…

Centos7使用docker搭建redis集群

前置准备&#xff1a; Centos7安装docker就不多说了… 本次目的是搭建3主3从&#xff08;当然你也可以按需扩展&#xff09;准备三台服务器&#xff0c;假定IP分别为&#xff1a;192.168.75.128、192.168.75.129、192.168.75.130安装 redis&#xff1a; #拉取redis docker p…

数字孪生像魔镜,映照出无限可能的未来

在当今科技飞速发展的时代&#xff0c;数字孪生作为一项极具潜力的前沿技术&#xff0c;正逐渐崭露头角&#xff0c;成为众多领域关注的焦点。它犹如一面神奇的魔镜&#xff0c;以数字化的方式精准映照出现实世界中的各种实体与系统&#xff0c;为我们开启了一扇通往无限可能未…

前端知识点---原型-原型链(javascript)

文章目录 原型原型链:实际应用面试题回答 原型 原型:每个函数都有prototype属性 称之为原型 因为这个属性的值是个对象&#xff0c;也称为原型对象 只有函数才有prototype属性 作用: 1.存放一些属性和方法 2.在Javascript中实现继承 const arr new Array(1, 2, 3, 4) con…

数据类设计_图片类设计之6_混合图形类设计(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论混合图形类设计 方法论-现在能做什么 这段属于聊天内容---有句话是这么说的&#xff1a;不要只埋头拉车&#xff0c;还要抬头看路。写代码也是…

2024年12月CCF-GESP编程能力等级认证C++编程一级真题解析

一级真题的难度: ‌ CCF-GESP编程能力等级认证C++编程一级真题的难度适中‌。这些真题主要考察的是C++编程的基础知识、基本语法以及简单的算法逻辑。从搜索结果中可以看到,真题内容包括了选择题、编程题等题型,涉及的内容如C++表达式的计算、基本输入输出语句的理解…

尤瓦尔·诺亚·赫拉利(Yuval Noah Harari)作品和思想深度报告

尤瓦尔诺亚赫拉利&#xff08;Yuval Noah Harari&#xff09;作品和思想深度报告 引言 尤瓦尔诺亚赫拉利&#xff08;Yuval Noah Harari&#xff09;是当今最具影响力的公众知识分子之一 ynharari.com 。作为一名历史学家和哲学家&#xff0c;他以宏大的视角和清晰生动的语言…

JConsole:JDK性能监控利器之JConsole的使用说明与案例实践

&#x1fa81;&#x1f341; 希望本文能给您带来帮助&#xff0c;如果有任何问题&#xff0c;欢迎批评指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目录 一、背景二、JConsole的启动与连接2.1 JConsole的启动2.2 进程连接2.2.1 本地进程连接2.2…

Neural Architecture Search for Transformers:A Survey

摘要 基于 Transformer 的深度神经网络架构因其在自然语言处理 (NLP) 和计算机视觉 (CV) 领域的各种应用中的有效性而引起了极大的兴趣。这些模型是多种语言任务&#xff08;例如情绪分析和文本摘要&#xff09;的实际选择&#xff0c;取代了长短期记忆 (LSTM) 模型。视觉 Tr…

Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。

一、软件介绍 文末提供源码和开源扩展程序下载 Browser Copilot 是一个开源浏览器扩展&#xff0c;允许您使用现有或定制的 AI 助手来帮助您完成日常 Web 应用程序任务。 目标是提供多功能的 UI 和简单的框架&#xff0c;以实现和使用越来越多的 copilots&#xff08;AI 助手&…

基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 XGBoost算法原理 4.2 XGBoost优化 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代码包含…

aws(学习笔记第三十三课) 深入使用cdk 练习aws athena

文章目录 aws(学习笔记第三十三课) 深入使用cdk学习内容&#xff1a;1. 使用aws athena1.1 什么是aws athena1.2 什么是aws glue1.2 为什么aws athena和aws glue一起使用 2. 开始练习aws athena2.1 代码链接2.2 整体架构2.3 代码解析2.3.1 创建测试数据的S3 bucket2.3.2 创建保…

基于RAGFlow本地部署DeepSpeek-R1大模型与知识库:从配置到应用的全流程解析

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; DeepSpeek服务器繁忙&#xff1f;这几种替代方案帮你流畅使用&#xff01;&#xff08;附本地部署教程&#xff09;-CSDN博客 10分钟上手…

SpringBoot 集成logback日志链路追踪

项目场景 有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。 为了解决这个痛点&#xff0c;就使用了 TraceId&#xff0c;根据 TraceId 关键字进入服务器查询日志中…

【Python办公】Excel通用匹配工具(双表互匹)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

【JAVA】七、基础知识“if+switch+循环结构”详细讲解~简单易懂!

目录 7、逻辑控制 7.1 分支结构 7.1.1 if 语句 语法格式1 语法格式2 语法格式3 7.1.2 switch语句 基本语法 执行流程 7.2 循环结构 7.2.1 while循环 语法格式 7.2.2 Break 7.2.3 Continue 7.2.4 for循环 语法格式 执行过程 7.2.5 do while循环 语法格式 7.3 …

【C++】每日一练(轮转数组)

本篇博客给大家带来的是用C语言来解答轮转数组&#xff01; &#x1f41f;&#x1f41f;文章专栏&#xff1a;每日一练 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享&#xff01; 今日思想&#xff1a;不服输的少年啊…

Python(学习一)

做网站有成熟的框架像FLASK、DJANGO、TORNADO&#xff0c;写爬虫有好用到哭的REQUESTS&#xff0c;还有强大到没盆友的SCRAPY 随着NUMPY、SCIPY、MATLOTLIB等众多第三方模块的开发和完善&#xff0c;不仅支持py支持各种数学运算&#xff0c;还可以绘制高质量的2D和3D图像&…

Java中类和对象

类和对象 面向对象的认识类的定义和使用1 类的定义2 类的创建3 类的实例化 构造方法1 构造方法的概念2 构造方法的注意事项 this关键字 面向对象的认识 前言 何为面向对象何为面向过程呢&#xff1f;&#xff0c;C语言是最经典的面向过程的语言,但是C语言虽然可以解决一定的问…

文本组件+Image组件+图集

Canvas部分知识补充 元素渲染顺序 以Hierarchy参考 下方物体在上方物体前显示 子物体在父物体前显示 下方物体永远在前显示&#xff0c;无论上方的层次结构 资源导入 绝对路径&#xff1a;C:\Windows\Fonts下的许多字体可以用做UIText的字体资源 图片导入&#xff1a; 1.图…