红黑树

红黑树(Red Black Tree,RBTree) 一、概念 红黑树是一种自平衡二叉查找树(二叉排序树)。与平衡二叉树(avl树)不同的是,红黑树是弱平衡二叉树,即它的左右子树高度差有可能大于1。 二、5大性质 每个节点要么是黑色, 要么是红色。 根节点是黑色。 每个叶节点(Nil,空值)都是黑色。 每个红色节点的两个子节点一定都是黑色。 任意一个节点到每个叶子节点的路径都包含相同数量的黑节点。 三、推论(或规律) 左子树和右子树的黑节点的层数是相等的。因此我们称红黑树的这种平衡为黑色完美平衡。(由性质5推出) 如果一个节点存在黑子节点,那么该节点肯定 阅读详情

1. 性质

  1. 每个结点或是红色的,或设黑色的。
  2. 根结点是黑色的。
  3. 每个叶子结点(NIL)是黑色的。
  4. 如果一个结点是红色的,则它的两个子结点都是黑色的。
  5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。

其核心思想是,对于任意一个子树(当然,整棵树本身也是它自己的一个子树), 从子树的根结点到每个叶结点的简单路径上:

  • 黑色结点数目相同。
  • 不能有连续的红色结点(可以有连续的黑色结点)。

所以,最长路径是最短路径的2倍。比如,对于一个子树,从它的根到所有叶子的每条简单路径上,黑色结点数目是N+1(N个非NIL加上一个NIL),那么其中最多嵌入N个红色结点(每个非NIL黑色结点后都嵌入一个红色结点),否则,就会出现连续的红色结点。也就是说,最短路径长度为N+1(全是黑色结点),最长路径长度为2N+1(每个非NIL黑色结点后都有一个红色结点),是2倍的关系。这就是红黑树要达到的目标:接近平衡,而不会出现有的子树过高,有的子树过低,最多2倍。

需要注意一点:NIL是黑色的,也就是说,出现黑结点的地方,可能是NIL,在编程的时候需要小心。

2. 左旋转和右旋转

这里写图片描述

旋转的特点:保持二叉查找树的性质(按中根遍历,结点是有序的)。如何记忆:
以x为当前结点进行左旋转:x变成(它的右孩子的)左孩子(同时,保持二叉查找树的性质)。
以x为当前结点进行右旋转:x变成(它的左孩子的)右孩子(同时,保持二叉查找树的性质)。

3. 插入操作

插入操作的步骤是这样的:

  • 按二叉查找树的算法,将目标结点插入;
  • 把目标结点设置为当前结点,并把它着红色;
  • 这时可能违背红黑树的性质,所以,进行修正;

其难点就在于如何修正。为了理解修正算法,我们先看看这时可能违背红黑树的哪些性质:

  • 性质1:不违背;
  • 性质2:若当前结点就是根结点(插入之前,是一棵空树),则违背;否则,不违背;
  • 性质3:不违背;
  • 性质4:若当前结点的父亲是红色,则违背;否则,不违背;
  • 性质5:不违背,因为当前结点被着红色,所以,被插路径上的黑色结点数目不变;

也就是说,结点插入后,可能违背性质2和性质4,有一下几种情形:

  1. 违背性质2:当前结点为根结点(插入之前,是一棵空树)。这个容易修正,直接改着黑色就万事大吉。
  2. 不违背性质2,也不违背性质4:不违背任何性质,已经是一棵合法的红黑树,无须修正。
  3. 不违背性质2,但是违背性质4:需要修正。

下面就着重看第3种情形:违背性质4。也就是说,当前结点和它的父亲都是红色。这一共有以下3类6种(1-a, 1-b, 2-a, 2-b, 3-a, 3-b)情况:

这里写图片描述

3.1 类别1

类别1的特点是:父亲和叔叔都是红色的。注意,这种情况下,祖父结点一定存在,因为红结点一定有黑色的父亲结点。重申一下,我们违背的只有性质4:存在连续的红色结点。为了解决这个问题:

  • 我们把父亲和叔叔都改为黑色,祖父改为红色(这样做可以保证:被影响的径上的黑色结点数目不变——一增一减,不至于违背性质5)。
  • 把祖父设置为当前结点。

这里写图片描述

由于当前结点刚刚由黑色变为红色,可以把它看作新插入的结点,重头进行修正过程。若它一直违背类别1,则一直重复上面的操作,直到下面任意一种情况出现:

  1. 当前结点是根结点(违背性质2)。这时,直接把它改着黑色即可。因为,把根结点由红色改着黑色相当于:在每条由根到叶的路径上,黑结点数目都增加1,保持相等。修正结束。
  2. 当前结点的父亲是黑色的(不违背性质2,也不违背性质4)。这时已经是一棵合法的红黑树了,修正结束。
  3. 演变为类别2或者类别3(不违背性质2,但违背性质4)。

3.2 类别2

新结点插入后,可能处于类别2;也可能由类别1演变为类别2。类别2有2-a和2-b两种,但它们是对称的,所以只研究一种即可,我们单看2-a。它可以通过下图所示的步骤修正为合法红黑树。

这里写图片描述

为什么说,经过上面的修正,红黑树就合法了呢?

  1. 没有改变二叉查找树的性质(旋转操作不会改变这一性质);
  2. 由于新的子树的根(即图3中的结点4)为黑色,所以,不管x颜色如何,都不会出现连续的红色结点;
  3. 被影响的各条路径上,黑色结点数目保持不变。见下表(被影响的子路径的黑结点数目不变,那么它所在的整条路径的黑结点数目也不会变):
被影响的子路径修正前(图1)黑色结点数修正后(图3)黑色结点数
…->x->p->…11
…->x->q->…11
…->x->r->…11
…->x->9->…22

综上所述:对于类别2,经这一步,就可以变为合法红黑树。

3.3 类别3

新结点插入后,可能处于类别3;也可能由类别1演变为类别3。类别3有3-a和3-b两种,但它们是对称的,所以只研究一种即可,我们单看3-a。它可以通过下图所示的步骤,修正为类别2(然后由类别2修正为合法的红黑树)。

这里写图片描述

需要注意的是,由类别3修正为类别2的过程中:

  1. 没有改变二叉查找树的性质(旋转操作不会改变这一性质);
  2. 被影响的路径上,黑色结点数目保持不变。见下表(被影响的子路径的黑结点数目不变,那么它所在的整条路径的黑结点数目也不会变):
被影响的子路径修正前(图1)黑色结点数修正后(图2)黑色结点数
…->x->p->…11
…->x->q->…11
…->x->r->…11
…->x->8->…22

3.4 插入操作总结

可见,插入操作的修正过程:

  • 若插入后处于类别1:最坏情况下,从插入位置(叶子)直到根,一直重复出现类别1,修正次数为树的高度。好一点的情况是,在到达根之前变为合法红黑树,或者演化为类别2或类别3;
  • 若插入后处于类别2(或由1演化为类别2):经过一次修正,变为合法红黑树;
  • 若插入后处于类别3(或由1演化为类别3):经一次修正演变为类别2,再由一次修正变为合法红黑树;

也就是说,最多改色次数为O(树的高度);最多旋转次数是2。

红黑树简介及左旋、右旋、变色 红黑树简介及红黑树的左旋、右旋、变色 阅读详情

相关推荐

红黑树的特点和使用场景

红黑树(Red-Black Tree)是一种,它在插入、删除和查找操作时保持了树的平衡性,从而保证了这些操作的时间复杂度为 O(log n)。红黑树在实际应用中广泛使用,例如在操作系统的内核中用于管理进程调度、文件系统、以及网络 I/O(如epoll机制中)。

m0_48022770的博客 1714

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

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

小七的博客 29万+

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

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

52Herzt的博客 2263

红黑树介绍

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

mz474920631的博客 4万+

个人关于红黑树的理解

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

brandong 4490

红黑树解析

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

静待花开 2229

【C++】红黑树

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

bushibrnxiaohaij的博客 2963

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1751

红黑树原理详解

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

Tattoo的博客 3万+

别再纠结了!实测罗技Flow、对拷线、微软Mouse without Borders,我的最终选择是...

本文通过实测对比罗技Flow、对拷线和微软Mouse without Borders等多设备控制方案,详细分析了各自的优缺点及适用场景。作者最终选择了对拷线与罗技键鼠的组合方案,为专业用户提供了稳定可靠的多设备协同办公解决方案,特别适合需要频繁传输大文件和跨设备操作的用户。

weixin_33696106的博客 405

学习Ultralytics (下载)

Ultralytics由创立,最初是为了简化目标检测模型的开发和应用,专注于构建高效、易用、性能卓越的深度学习框架。其主要产品之一是 YOLO 系列模型,尤其是最新的YOLOv5和YOLOv8,因其在精度、速度和可扩展性方面的出色表现而广受欢迎。

2301_76846375的博客 2864

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

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

bhbcdxb123的博客 2166

手把手教你用组态王KingSCADA 3.53读取S7-1200 PLC数据(保姆级图文教程)

本文提供了一份详细的组态王KingSCADA 3.53读取S7-1200 PLC数据的实战教程,涵盖从硬件连接到软件配置、变量映射到故障排查的全流程。特别针对初学者常见问题提供解决方案,帮助工程师快速实现稳定通信,提升工业自动化系统效率。

weixin_26876073的博客 672

C++——红黑树

C++之红黑树板块讲解

dongxue727504的博客 3277

利用Sigrity的SPEED2000进行时域电源噪声分析

SPEED2000进行时域电源噪声分析

ZHENGSA的博客 3620

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 763

【C++】——红黑树(手撕红黑树,彻底弄懂红黑树)

我们之前都学过ALV树,AVL树的本质就是一颗平衡二叉树,它的作用就是查找,插入和删除节点,最坏的时间复杂度都是O(logn)的,同时维护的高度差都是小于等于1的,但是也就是因为这个原因才被红黑树所替代红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。

m0_74092462的博客 2084

LoRa学习:LoRa通信调制解调的实现原理与性能

LoRa学习:LoRa调制解调原理与性能 1、LoRa调制解调器原理 LoRa调制解调器采用专利扩频调制和前向纠错技术。与传统的FSK、OOK调制技术相比,LoRa扩大了无线通讯链路的覆盖范围(实现了远距离无线传输),提高了链路的鲁棒性。。 开发人员可调整扩频因子和纠错率这两个参数,从而平衡通讯时的带宽占用、通信速率、空中包的存活时间、以及抗干扰性等。。 LoRa调制解调器...

HowieXue 薛永浩的博客 3万+

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

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

Bob的博客 2831

如何使用Google Maps API爬取地理数据:详细教程与Python实现

Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。

2201_76125261的博客 733

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

CSQCSQCC的博客 1614

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

qq_54883034的博客 4122

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++之红黑树

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

cls的博客 2398
上一篇: C++点滴--boost optional 和 variant
下一篇: 使用ceph-deploy 2.0.0 部署ceph 12.2.5集群
for_tech
博客等级 码龄11年 50粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值