红黑树

【C++详解】——红黑树 本文介绍了红黑树的概念、性质,详细解释了红黑树插入节点的过程。 阅读详情

红黑树

红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型用途是实现关联数组。它在1972年由鲁道夫·贝尔发明,被称为"对称二叉B树",它现代的名字源于Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文。红黑树的结构复杂,但它的操作有着良好的最坏情况运行时间,并且在实践中高效

定义

  • 节点是红色或黑色
  • 根是黑色
  • 所有叶子都是黑色(叶子是NIL节点)
  • 每个红色节点必须有两个黑色的子节点(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点

自平衡操作

  • 变色:节点的颜色由红变黑或者由黑变红
    左旋
    左旋:以某个节点为旋转节点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变
    右旋
    右旋:以某个节点为旋转节点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变

插入操作的平衡调整

红黑树规定,插入的节点必须是红色的。关于插入操作的平衡调整,有两种特殊情况,非常好处理:

  • 如果插入节点的父节点是黑色的,那我们什么都不用做,它仍然满足红黑树的定义。

  • 如果插入的节点是根节点,那我们直接改变它的颜色,把它变成黑色就可以了。

除此之外,其他情况会违背红黑树的性质,于是需要进行调整。新节点插入之后,如果红黑树的平衡被打破了,那一般会有下面3种情况:

正在处理的节点为X丶父节点为P丶叔叔节点为S丶祖父节点为G丶Hx代表其子树的BH(黑高,如H2,即黑高为2)

CASE1:如果正在处理的节点是X,它的叔叔节点Y是红色

在这里插入图片描述

  • 将父节点P丶叔叔节点Y的颜色都设置为黑色
  • 将祖父节点G的颜色设置成红色
  • 正在处理的节点X回溯至祖父节点G(正在处理的节点就是G了,继续调整)

分析:G为红色,可能违背红黑树的性质,需要继续调整(如果G为根节点,则把G的颜色设置为黑色,即满足红黑树的性质,调整结束,此时整个红黑树的BH增加1,这是唯一增加整个红黑树的BH的情形)

CASE2:如果正在处理的节点是X,它的叔叔节点Y是黑色,X是其父节点P的右子节点

在这里插入图片描述

  • 围绕父节点P左旋
  • 把X指向P(即P变成了正在处理的节点)
  • 跳到CASE3

分析:P丶X的关系仍然违背了红黑树的性质,需要继续调整

CASE3:如果正在处理的节点是X,它的叔叔节点Y是黑色,X是其父节点P的左子节点

在这里插入图片描述

  • 将父节点P的颜色设置为黑色,祖父节点G的颜色设置为红色
  • 围绕祖父节点右旋
  • 调整结束

分析:最后满足红黑树的性质,调整结束

删除操作的平衡调整

红黑树的删除操作的平衡调整要比插入的相对难点。不过原理类似,我们仍然根据正在处理的节点与周围的节点分布特点,来进行一定规则的调整。

正在处理的节点为X丶父节点P丶兄弟节点S丶左侄LN丶右侄RN丶Hx代表其子树的BH
下面正在处理的节点X均为父节点P的左孩子,如果是右孩子,则为镜像操作

CASE1:如果正在处理的节点是X,它的兄弟节点S是红色

在这里插入图片描述

  • 将兄弟节点的颜色设置为黑色
  • 将父节点的颜色色泽为红色
  • 围绕父节点P左旋,操作后LN变成新的兄弟节点

分析:X的BH比LN的BH少1,即违背了红黑树的性质,继续调整

CASE2:如果正在处理的节点是X,它的兄弟节点S丶兄弟节点的左右子节点均为黑色
2-1:父节点P是黑色

在这里插入图片描述

  • 将兄弟节点S的颜色设置为红色
  • 正在处理的节点X回溯至父节点P(正在处理的节点就是P了,继续调整)

分析:调整后P的黑高减少了1,即会整个红黑树的的每个节点到达其可达叶子节点的所有路径,包含的黑色节点的数目不同,这违背了红黑树的性质,需要继续调整(若P为根节点的,则执行该步骤会引起BH的减少,这是唯一减小整个红黑树的BH)

2-2:父节点P是红色

在这里插入图片描述

  • 将兄弟节点S的颜色设置为红色
  • 将父节点P的颜色设置为黑色

分析:在父节点没有变色前,其分析和case 2-1是一致的,父节点变色之后,P减少的BH就补回来了,即满足所有性质,调整结束

CASE3:如果正在处理的节点是X,它的兄弟节点S是黑色,S的左子节点LN为红色,右子节点RN为黑色

在这里插入图片描述

  • 将左侄节点LN的颜色设置为黑色
  • 将兄弟节点S的颜色设置为红色
  • 围绕兄弟节点S右旋
  • S指向LN
  • 跳到CASE4

分析:X的BH仍然比LN的BH少1,即继续调整

CASE4:如果正在处理的节点是X,它的兄弟节点S是黑色,父节点P可红可黑,S的右子节点RN为黑色
4-1:LN为红色

在这里插入图片描述

  • 将兄弟节点S的颜色设置为与父节点P的颜色相同
  • 将父节点P的颜色设置为黑色
  • 将S的右子节点RN的颜色设置为黑
  • 围绕父节点P左旋
  • X指向根节点

分析:调整后满足红黑树的性质,调整结束

4-2:LN为黑色

在这里插入图片描述

  • 将兄弟节点S的颜色设置为与父节点P的颜色相同
  • 将父节点P的颜色设置为黑色
  • 将S的右子节点RN的颜色设置为黑
  • 围绕父节点P左旋
  • X指向根节点

分析:调整后满足红黑树的性质,调整结束

【树形结构】红黑树 {概念及性质;红黑树的结构;带头结点的红黑树;红黑树的实现;红黑树插入操作详细解释;红黑树的验证} 阅读详情

相关推荐

个人关于红黑树的理解

目录   红黑树(red-black-tree) 一.红黑树的定义和性质 二.红黑树的结构 三.输出一颗红黑树 四.查询红黑树 查找 查找最大关键字元素和最小关键字元素 查找前驱和后继 五.※插入和删除 插入 删除 六.完整代码 红黑树(red-black-tree) 一.红黑树的定义和性质 红黑树是一种二叉查找树,在每个结点上增加一个存储位表示结点的颜色,,可以是...

brandong 4490

2022鹏城杯web

2022鹏城杯web

羽的博客 9054

红黑树解析

写在前面:我是「且听风吟」,目前是某上市游戏公司的大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面。 如果你也对大数据感兴趣,希望在这个行业一展拳脚。欢迎关注我,我们一起努力,一起学习。博客地址:https://ropledata.blog.youkuaiyun.com 博客的名字来源于:且听风吟,静待花开。也符合我对技术的看法,想要真正掌握一门技术就需要厚积薄发的毅力,同时保持乐观的心态。 你只管努力,剩下的交给.

静待花开 2231

【数据结构】史上最好理解的红黑树讲解,让你彻底搞懂红黑树

狂肝半个月的学习笔记,最通俗易懂的红黑树讲解。带你快速掌握红黑树~

小七的博客 29万+

树 —— 红黑树

源代码地址:https://github.com/Zheng-Wenkai/DataStructure.git 一,红黑树的介绍 1. 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 2. 在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(logn)。

starter_____的博客 2388

Unity获取透明物体深度数据

Unity获取透明物体深度数据前言透明&景深需求模型透明度部分带透明通道图片/视频部分半透明模型获取深度的具体实现方法带透明度图片/视频获取深度的具体实现方法结束语 前言 最近在做的项目有很多奇怪的需求,甚至之前在unity里用插件写了一个类似于蓝图的行为树插件,之后有时间给大家讲一讲相关的实现方法,今天刚解决了unity里透明物体无法获得深度数据的问题。所以分享给大家。 透明&景...

可以吃的妙脆角的博客 2632

红黑树介绍

红黑树一、红黑树的概念红黑树的性质红黑树节点的定义红黑树结构二、使用步骤1.引入库2.读入数据总结 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 红黑树的性质 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数

mz474920631的博客 4万+

从混淆到清晰:实战解读LASSO回归图与交叉验证图(R glmnet二分类案例)

本文深入解析LASSO回归在R glmnet中的可视化应用,特别针对二分类问题。通过详细解读系数路径图和交叉验证误差图,帮助读者掌握变量筛选的关键技巧,并指导如何基于业务需求选择最优lambda值,实现从数据可视化到决策的完整流程。

weixin_32678995的博客 429

红黑树(超详解)

上一篇文章我们讲了AVL树,但是AVL树只是一个过渡,我们实际当中用的更多另外一颗树还是红黑树.也不能说红黑树就是AVL树的改进,它是用另外一种方式来控制.这棵树更抽象一些,下一步我们来看一下.

庖丁解牛,恢恢乎游刃有余 1694

跨厂商网络设备的RADIUS认证:Windows NPS的兼容性与最佳实践

本文详细探讨了Windows NPS在多厂商网络环境中的RADIUS认证实践,特别针对华为、华三、思科等主流设备的兼容性问题提供解决方案。从基础配置到高级优化,涵盖VSA属性映射、认证协议选择及安全加固措施,帮助企业实现统一身份认证并提升网络安全性。

weixin_29213827的博客 422

ArcGIS Pro样式导入全攻略:从.style到.stylx的完整转换流程(附常见问题解决)

本文详细解析了ArcGIS Pro中从旧版.style文件导入并转换为新版.stylx格式的完整流程。针对用户在迁移过程中常见的样式库为空、符号匹配失败、显示异常等问题,提供了清晰的排查思路与解决方案,帮助用户高效完成样式库的升级与迁移,确保制图工作的连续性。

raspberrypi5的博客 517

【C++】红黑树

因为每个节点都存在颜色,并且不为黑色就为红色,所以我们可以定义一个表示颜色的枚举常量。红黑树依旧是三叉链。

bushibrnxiaohaij的博客 2964

瑞芯微RK3568开发板实战:Android11系统parameter.txt文件配置全解析(附常见问题排查)

本文深入解析了瑞芯微RK3568开发板在Android 11系统下parameter.txt文件的配置要点与实战技巧。作为BootLoader启动阶段的核心蓝图,该文件决定了硬件初始化、分区布局及电源管理。文章详细拆解了身份标识、GPIO控制(PWR_HLD)、命令行参数及分区表等关键字段的配置逻辑,并针对RK3568平台与Android 11特性提供了专项适配策略,最后附带了启动失败、分区异常等常见问题的深度排查方法。

php55的博客 897

红黑树原理详解

   二叉查找树由于在频繁的动态更新过程中,可能会出现树的高度远大于 log2n的情况,所以就会导致各个操作效率下降,最坏的情况下就会退化为链表,变为O(n).很明显,想要解决这个问题,有效的一种办法就是使得树的高度不要差很多,也就是平衡它.     最先发明的平衡二叉查找树是AVL树,(它严格符合平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。)但是在...

Tattoo的博客 3万+

带挂牵引车倒车运动模型推导及仿真实现

半挂牵引车在倒车时,由于鞍座主销的连接限制,其运动方式与乘用车有显著差异。例如,乘用车在右侧倒车入库时,只需确定泊车起点并将方向盘向右打死。相反,牵引车在倒车时需要先向左转方向盘,当铰接角达到防折叠的临界值时,再将方向盘向右转回,以调整牵引车与挂车至直线状态,完成泊车入库。本研究旨在建立一个基于牵引车带挂车倒车运动学模型,该模型基于以下假设: 道路在车辆行驶过程中保持平坦,无凹凸不平; 车辆以低速行驶,且在运行过程中车身不发生侧倾或俯仰; 行驶过程中,轮胎无变形,无侧向滑动,且不产

jianmo的博客 2697

计算机技术发展5大阶段,现阶段计算机技术应用及发展

【摘要】现代计算机科学技术的发展和普及运用,为世界各国民众基础性生产生活实践活动的组织开展路径造成了深刻影响,本文围绕现阶段计算机技术应用及发展,择取两个具体方面,展开了简要分析。【关键词】计算机技术;应用;发展改革开放以来,计算机设备的广泛运用,促进了计算机科学技术的逐步发展成熟。计算机科学技术是具备新兴表现特征的尖端应用技术,其在现代工业生产和社会生活实践活动过程中的广泛引入运用,给世界各国基...

weixin_42126677的博客 2637

【C++】————红黑树

RED,BLACK, _kv(kv){}private:_left、_right 和 _parent 分别指向节点的左子节点、右子节点和父节点。_kv 是一个 pair,存储节点的键和值。_col 表示节点的颜色,可以是 RED 或 BLACK。接收一个 pair 作为参数,初始化节点的键值对,并将节点的颜色初始化为 RED。其他指针成员初始化为 nullptr。

bhbcdxb123的博客 2167

“华为杯”研究生数学建模竞赛2020年-【华为杯】D题:无人机集群协同对抗(附获奖论文和MATLAB代码实现)

1.问题重述摘 要:本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题,结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法,构建了无人机集群协同对抗推演模型。,构建了。我们综合考虑了,和。首先分析红方在集群约束下的贪婪队形和拦截策略,然后我们基于内点法联合MATLAB和AMPL编程求解蓝方突防的非线性规划解,最后基于蒙特卡洛法对整个蓝方突防过程进行推演,得到突防概率图。通过推演,我们提出了两块的区域作为所求区域,并对蓝方的最优突防策略进行分析。

getusushu的博客 1552

C++——红黑树

C++之红黑树板块讲解

dongxue727504的博客 3280

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++中红黑树的实现 -- 红黑树的概念,红黑树的规则,红黑树插入时的情况分析,红黑树的实现,红黑树的查找,红黑树的验证

红黑树是一种自平衡二叉搜索树,通过颜色约束确保最长路径不超过最短路径的两倍。其核心规则包括:根节点为黑色、红色节点不能连续、每条路径黑色节点数相同。插入操作涉及变色和旋转两种调整方式,根据叔叔节点颜色分为不同处理情况。与AVL树相比,红黑树平衡要求较宽松,旋转次数更少,但查找效率相近(O(logN))。本文详细介绍了红黑树的结构定义、插入逻辑(包括单旋和双旋场景)、验证方法,并提供了与AVL树的性能对比测试代码,显示两者在百万级数据下的操作耗时相当。

CSQCSQCC的博客 1615

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

红黑树系列1——红黑树的建立

原创码字不易,转载请注明出处,谢谢~ 红黑树系列2——红黑树的删除(码字中,待发表) 红黑树系列3——红黑树的应用(码字中,待发表) 红黑树系列4——红黑树的代码实现(码代码中,待发表) 红黑树动态建立,删除网站(强强强强烈推荐,根据网页上自己构建和删除几遍红黑树,比看文章有用太多太多):https://www.cs.usfca.edu/~galles/visualization/RedBlack.html 目录 一、红黑树的建立 1、建立红黑树 例子1、解决连续右右红色节点 例子2、解决

Bob的博客 2831

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++之红黑树

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 4.2.2 红黑树的性质 1. 每个结点不是红色就是黑色 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个孩子结点是黑色的,但是没有连续的红节点 4. 对于每个结点,从该结点到其所有后代叶结点的简单路径...

cls的博客 2398

【红黑树】都这样讲了,不会还有人不会红黑树吧

我们在前面学习过二叉树,而二叉树有被简单的分为普通二叉树,二叉搜索树,完全二叉树,二叉平衡树等,在二叉搜索树中包含有 AVL树,红黑树。博主在以前的文章中写过AVL树的相关内容,有兴趣的读者可以去康康,直接甩链接(124条消息) 【数据结构高阶】终于有人把AVL树给说清了_小小怪下士~的博客-优快云博客我们学习过AVL树的同学们都知道,AVL树是一个绝对平衡的二叉树,所谓的绝对平衡说的就是一个节点的左右子树的高度之差的绝对值是不能超过1的,我们同时也知道这个。

qq_54883034的博客 4123
上一篇: 栈帧结构
amyacker
博客等级 码龄9年 2粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值