浅谈红黑树

article/2025/9/21 0:59:28

这篇文章的删除操作参考这篇博客博客地址

聊红黑树之前我想先来谈谈B树(多路平衡查找树),为什么来聊这个东西呢,其实红黑树就是一个B树。了解B树后对红黑树的理解会比较有帮助。
首先是2、3、4节点。
在这里插入图片描述
红黑树中单个黑节点对应B树中一个2节点,黑节点加上一个红节点对应一个3节点,黑节点加上两个红节点对应4节点。这边看一个示例:
在这里插入图片描述
介绍完插入后正式开始聊聊红黑树。
一、红黑树的红黑规则
1.根节点是黑色的。
2.插入节点是红色的。e.g.不是说一直是红色,插入的节点可以进行变色
3.每个叶节点(NIL)都是黑色节点。
4.不能存在两个连续的红色节点
5.从任一节点出发到叶节点(NIL)的路径上存在相等数量的黑色节点。

ps:红黑树的黑色节点越多红黑树就平衡,如果一颗红黑树全是黑色节点,那么这一定是一颗满二叉树。
下面是一颗不符合红黑树规则5的树。
在这里插入图片描述

下面先明确两个概念左旋与右旋:
右旋
在这里插入图片描述

左旋
在这里插入图片描述

二、插入
根据红黑树规则的第5条很容易想到插入的节点的颜色一定是红色的。

插入大概分成以下几种情况:
1.根节点,直接变色
在这里插入图片描述

2.插入的位置的父节点是黑色,直接插入。
在这里插入图片描述

3.插入的位置的父节点是红色(处理这些情况主要注意两个红色节点出现的位置和插入节点的叔叔节点的颜色,根据实际情况进行调整)
又可以分为以下两种情况
3-1: 叔叔节点是红色
这种情况可以让父亲节点和叔叔节点还有祖父节点直接变色就能解决。
在这里插入图片描述
注意如果这里变色之后出现两个连续的红色节点那么递归向上进行调整,直到根节点,最后根据红黑树第1条规则将根节点染黑

3-2: 叔叔节点是黑色(这里的情况有点和AVL类似可以先去看一下AVL再来看插入操作应该有简单很多)
这种情况又要分为两种情况
3-2-1: 插入节点插入的位置与父节点相对于祖父节点位置相同时,也就是出现黑红红节点时的位置为左左左/右右右时,直接右旋/左旋处理。
下面给出左左左的例子:
在这里插入图片描述
插入完成后可以看到在出现了两个连续的红色节点这边违反了红黑树的规则4所以这边要进行右旋调整。右旋后要对节点进行变色处理使其重新符合红黑树的规则。
在这里插入图片描述
可能这里会有疑问了为什么不是下面这个变色呢?
在这里插入图片描述

我的理解是如果是这样变色的话变完之后可能会存在两个连续的红色节点,可能还要再变一次所以没必要。

3-2-2插入节点插入的位置与父节点相对于祖父节点位置不相同时,也就是出现黑红红节点时的位置为左左右/右右左时,这个时候要先进行一次左旋再进行右旋/先进行一次右旋再进行左旋。
在这里插入图片描述
进行一次左旋或者右旋之后就可以跳转到3-2-1的情况进行同样处理了。
红黑树插入操作总结:
父黑直接插,叔黑看双红。左左右右单次转,左右右左两次转。

在聊红黑树删除之前,我想先聊聊B树的删除操作。
B树的删除分为下面三种情况:
1.可以直接删除的,就直接删除。
在这里插入图片描述
2.“兄弟够借”的情况
图中要删除一个二节点65,那肯定不行啊删了就没了,那怎么办呢,往他的右边兄弟去借,借了之后就能删了。

3.“兄弟不够借“的情况
”兄弟不够借“这种情况就麻烦一点,图中要删除5这个结点,5也是一个二节点,他的左右兄弟都没有能借的了,那怎么办呢,只能找他的父节点去借一个数了和他的兄弟结点一起组成一个结点,

三、 删除
这边删除的主要思想是:找到被删除节点的直接后继然后用直接后继的值替换掉被删除节点的值然后删除直接后继。所以不论如何被删除节点都有一个“右子树”,但右子树可能为空树。且右子节点为NIL节点。
删除可以分为三种情况:
1.被删除节点没有子节点(均为NIL)
删红色节点直接删就可以,但是如果要删除的是黑色节点那么删除之后黑色节点的个数会减少一,违反了红黑树的第4条规则,这个时候就需要进行调整了。
在这里插入图片描述

2.被删除节点有一个子节点
在这里插入图片描述

这个时候子节点一定为红色,因为如果子节点为黑色就会违反红黑树第4条规则导致有子节点的那一边多出一个黑色节点。同时待删除节点一定会为黑色如果待删除节点为红色就会违反红黑树第5条规则,将待删除节点删除之后只需要将待删除节点的子节点放到待删除节点的位置然后将子节点颜色涂黑即可。

3.被删除节点有两个子节点
这种情况是最复杂最烦人的,一般采用将待删除节点的直接后继的值放到要删除的位置然后将直接后继删除。下面讲讲为什么可以转化为第一种和第二种情况:这边遍历顺序是中序遍历,也就是说待删除节点的直接后继的左子树一定为NIL而右子树可能是NIL也可能不是。
这个情况的方法分为两种因为过自己这条路径的黑色节点因为删除了一个所以比过兄弟节点那条路径少一。
1.让兄弟节点那条路少过一个黑色节点自己这边路径不变
2.自己这边多过一个黑色节点,兄弟节点那条路径不变。
兄弟结点为黑
白色节点表示不关心节点颜色
下面分3种情况讨论:被删除节点的兄弟子左右子节点分别为黑黑,(红黑,黑红),红红讨论。
下面的情况根据兄弟节点子节点出现红色节点的位置和兄弟节点相对于父节点的位置进行调整。
1.黑黑
在这里插入图片描述
直接让兄弟路径少一就行了,直接把兄弟节点给染红。
2.红黑/黑红/红红的情况,这种情况要结合上面的左旋/右旋的情况来理解会比较好。
这边可以分为右右右型,右右左型,左左左型,左左右型。其中右右右和左左左型分别变色+一次旋转即可。右右左和左左右型则要旋转+变色+旋转+变色。
在这里插入图片描述
在这里插入图片描述
注意右边图片是红黑平衡的这边给出一个具体的例子来帮助理解,当初我一直以为这里违反了红黑树第5条规则纠结了好久。在这里插入图片描述
兄弟节点为红
在这里插入图片描述

注意!经过上述调整之后,进行“子”节点的黑色节点仍然少1。

在这里插入图片描述
这个时候只要再次左旋或者再次右旋即可平衡。这边只给出一种情况的图另外一种情况类似。e.g.这边解释一下上面的子节点一定为NIL节点,至于为什么可以自己思考一下。所以上面的图仍然遵守红黑树第5条规则


http://chatgpt.dhexx.cn/article/ViA3rWZu.shtml

相关文章

红黑树的理解与代码实现

红黑树 我们知道对于二叉搜索树而言,无法保证树的平衡性,从而使得进行操作的时候时间复杂度在O(logn)与O(n)之间。这样是不稳定的。而2-3树则借助于3-结点和临时的4-结点,通过分解,解决了平衡问题。例如对于插入,在最终…

图解TreeMap的红黑树平衡操作fixAfterInsertion(),接着手撕红黑树添加节点

一、前言 啥也不想说,就卷、卷技术;手撕红黑树搞起。 1、红黑树简介 红黑树就是一种平衡的二叉查找树,其有五个特点: 1.每个节点要么是红⾊,要么是⿊⾊; 2. 根节点⼀定是⿊⾊的; 3. 每个叶⼦…

有人在jdk源码里下毒【class.newInstance() bug复现】

如图 在用反射的时候,发现这个方法被idea划横杠了 稍加思索后发现是这方法从jdk9开始弃用了,倒不影响使用,对象还是能正常射出来,就是看着很难受 (最近刚把本地开发机从8升到11,难怪) 说下我…

红黑树理解以及Java实现

红黑树本身并不复杂,只是在插入删除的时候情况比较多,如果强行记忆的话会显得比较困难,而且容易忘记。所以以前对红黑树一直没有很好的掌握。恰好这次借着复习数据结构的机会,静下心来仔细的学习了一下红黑树,并用Java…

Java 9 vs Java 8:引入模块化和JShell的全面升级

Java 9 是 Java 语言的一个重大版本升级,带来了许多新的特性和改进。 在本篇博客中,我将为您介绍 Java 9 的一些重要特性。 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 目录 一、模块化二、JShell三…

HashMap 在 JDK 1.8 后新增的红黑树结构

读完本文你将了解到: 点击查看 Java 集合框架深入理解 系列 - - 乾杯传统 HashMap 的缺点HashMap 在 JDK 18 中新增的数据结构 红黑树HashMap 中关于红黑树的三个关键参数HashMap 在 JDK 18 中新增的操作桶的树形化 treeifyBinHashMap 在 JDK 18 中新增的操作 红黑树…

epoll底层红黑树使用部分源码剖析:为什么使用红黑树以及如何使用红黑树

我们知道epoll的底层使用了红黑树来管理文件描述符,为什么会选择红黑树这种结构呢? 以下是个人理解: epoll和poll的一个很大的区别在于,poll每次调用时都会存在一个将pollfd结构体数组中的每个结构体元素从用户态向内核态中的一…

HashMap在jdk1.8为何引入了红黑树?

原创不易,麻烦点个关注,点个赞,谢谢各位。 二叉查找树 二叉查找树,也称有序二叉树(ordered binary tree),或已排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任…

从电路的角度理解特征阻抗

传输显得特征阻抗不是真实的电阻,微波技术课程会从波的角度描述特征阻抗,这次试图从电路的角度来理解 无损传输线是分布的L C 网络,假设是无限长传输线 从a,b两点看入的阻抗是相等的,所以可以简化成下图: 化简可得 这…

同轴电缆阻抗总结(电阻、阻抗、特性阻抗)

文章目录 同轴电缆电阻、阻抗、特性阻抗电阻阻抗(Impedance)特性阻抗 总结 同轴电缆 同轴电缆是一种电线及信号传输线,一般是由四层物料造成:最内里是一条导电铜线,线的外面有一层塑胶(作绝缘体、电介质之…

传输线阻抗方程的推导

在传输线理论中,当一段特征阻抗为 Z 0 Z_0 Z0​ 的传输线的终端连接了一个阻抗为 Z L Z_L ZL​ 的负载时,看向这段传输线的输入阻抗 Z i n Z_{in} Zin​ 将不再是 Z 0 Z_0 Z0​。 传输线阻抗方程 (Transmission Line Impedance Equation) 就是计算…

PCB阻抗计算

阻抗匹配是指在能量传输时,要求负载阻抗要和传输线的特征阻抗相等,此时的传输不会产生反射,这表明所有能量都被负载吸收了。反之则在传输中有能量损失。在高速PCB设计中,阻抗的匹配与否关系到信号的质量优劣,下面简单介…

特征阻抗和阻抗匹配_没有诸如对象关系阻抗不匹配之类的东西

特征阻抗和阻抗匹配 过去十年来,ORM的许多批评都错了这一点,因为它不准确。 到本文结尾,我们将得出以下结论: 关系(数据)模型和面向对象的模型之间没有显着差异 如何得出这个结论? 继续阅读&a…

传输线特征阻抗计算

一直有很多人问我阻抗怎么计算的. 人家问多了,我想给大家整理个材料,于己于人都是个方便.如果大家还有什么问题或者文档有什么错误,欢迎讨论与指教! 在计算阻抗之前,我想很有必yi要理解这儿阻抗的意义 传输线阻抗的由来以及意义 传输线阻抗是从电报方程推导出来(具体可以查询微…

PCB特征阻抗计算

见教程:链接:https://pan.baidu.com/s/1V4UbEoKfMD1bilwu-Qwdyg 密码:ml6t

射频特征阻抗

Characteris Impendance(特性阻抗,也称为‘特征阻抗’)是我们经常看到并使用自己的术语之一,但非常模糊且难以解释。以下是来自几个不同来源的Characteris Impendance(特性阻抗)的一些定义。 (如果您检查10个不同的来源,您会看到1…

高速PCB的特征阻抗设计

我们在高速PCB设计当中,经常对高速信号线做特征阻抗控制来优化信号质量。那特征阻抗是什么东西呢? 1.传输线原理 介绍特征阻抗之前,我们复习下《信号完整性视频》介绍的传输线基本原理。如下图左边是低频电路采用集总参数的RLGC模型,右边高频电路采用分布参数的RLGC模型。…

传输线的波阻抗与特征阻抗

以上是时域方程,而我们的“波阻抗”是定义在频域下的(正弦激励)。 1)“相电压/电流”的第一、二项分别代表了前向传输、反向传输分量; 2)前向传输和反向传输分量两者无必然联系。 补充修改: 1&…

PCB寄生参数和特征阻抗

1、微带线Microstrip 相同情况下,PCB板厚H越厚(影响很大): 特征阻抗越大(H↑ > ln()↑ > Z0↑)传输延时几乎不变(与H无关)寄生电感越大(H↑ > ln()↑ > L…

传输线的特征阻抗

要理解特征阻抗首先要建立一个模型。传输线零阶模型 在这个模型中,每一个步长是△X,单位长度的电容为CL,所以每个步长的电容 CCL*△X 然后我们根据电荷量 QU*CI*t ,电流I Q / t C * U / t,其中t △X / v得到 电流 …