这里有一份小白白白式的·图解红黑树(简介&&插入篇)

【数据结构】【王道408】——PPT精要与思维导图实战解析 本文分享了一套高效学习数据结构的方法,特别针对王道408课程。该方法的核心在于将PPT精要截图与亲手绘制思维导图相结合,通过“捕获-构建-应用”三步,将抽象知识转化为可视化、结构化的知识图谱。文章以并查集、红黑树等难点为例,详细拆解了如何利用此方法攻克数据结构学习难关,实现从被动接受到主动构建的转变,从而扎实掌握知识并提升解题能力。 阅读详情

点击蓝色字关注我们!

一个努力中的公众号

长的好看的人都关注了

5e5667cb2b3963b78556d8c5c6b0dba4.png

认识二叉查找树

首先,红黑树是一种特别的二叉查找树,那么什么是二叉查找树呢?

一棵空树,或者是具有下列性质的二叉树:

  1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  2. 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  3. 左、右子树也分别为二叉排序树;

  4. 没有键值相等的结点。

2af3adb5a3e73e21de2a7e9cd769aa41.jpeg
二叉查找树

红黑树的定义

红黑树是每个结点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

  1. 结点是红色或黑色;

  2. 根是黑色;

  3. 所有叶子都是黑色(叶子是NIL结点);

  4. 每个红色结点的子结点必为黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点);

  5. 从任一结点到其每个叶子的所有简单路径都包含相同数目的黑色结点。

下面是一个具体的红黑树的图例:

1705f9d68bebbf32a6e8084d805f7ba7.png
红黑树

如上图,13 结点为根结点,为黑色(条件 2)。各个叶子结点都是黑色(条件 3)。不存在两个相连的红色结点(条件 4)。对于条件 5,我们以从 13 出发走向 17 结点及以后的路来看,有 6 条简单路径,每条简单路径中都包含3个黑色结点 「13-15-nil(L), 13-15-nil(R), 13-25-22-nil(L),13-25-22-nil(R),13-17-25-27-nil(L),13-17-25-27-nil(R) 」,无论哪一条路径,黑色结点数量都一样(条件 5)。

树的旋转

在讲解红黑树插入操作前,我们需要先了解一个操作 —— 树的旋转。

这里我们以二叉查找树为例。如以下动图,我们以图为例进行说明(Left Rotation 字幕出现后才开始左旋动画,Right Rotation 字幕出现后开始右旋动画,下方也附有静态图):

94d52ec9b530f0d4bfc6a2f3818d03f3.gif
树的旋转

首先要说明,二叉搜索树的旋转并不会影响二叉搜索树的性质,它旋转过后还是一棵二叉搜索树。旋转过程中也始终受二叉搜索树的主要性质约束:

  • 右子结点比父结点大

  • 左子结点比父结点小

以上图为例,首先在旋转之前,这棵二叉搜索树一定满足α<A<β<B<γ。

以右旋为例,进行右旋转时

  • 首先向右旋转,根结点的左孩子将成为新的根结点,其左子树跟随它成为新的根结点的左子树,即如图,A 旋转后成为新的根结点,α 跟随 A 成为新的根结点左子树。

  • 此时原根结点,也就是图中的 B 结点,下降成为 A 的右子树,而原来的 A 的右子树 β 将会移动成为 B 的左子树。此时仍旧满足α<A<β<B<γ.

而在这一过程中,整棵树一直遵守着前面提到的几个约束。相反的左旋转操作亦然。

同理我们再看看左旋,过程简单如下:

  • A 下降成为左孩子,B 上升成为新的根结点,其右子树 γ 跟随其成为新根结点右子树,原先 B 的左子树 β 现在成为了 A 的右子树,变化前后均遵循α<A<β<B<γ.

附一张静态图方便理解:

0b4c056430cb43d780daa20919704a6c.png
静态-树的旋转图

红黑树的插入

以上完成了对二叉查找树以及树的旋转,下面我们正式进入红黑树操作的步骤。

插入的步骤主要为如下两大点:

  1. 插入结点 Z 到合适位置并将其置为红色

  2. 重新着色并旋转结点来解决违规问题

我们可以想到,插入结点必将打破平衡,而修复这些平衡并不是什么太困难的事情。

对于第二步,再插入结点 Z 后,可能有4种情况发生:

case1. 插入 Z 为根结点

case2. Z 的叔叔结点为红色

case3. Z 的叔叔结点为黑色,triangle 型

case4. Z 的叔叔结点为黑色,line 型


对于4种情况各自的处理方式

case1:我们仅仅需要做的操作就是将 Z 置为黑色

case2:我们将需要为 Z 的父结点、叔叔结点和爷爷结点重新着色

9032da6d46d2e7a6d82e100000c4e43c.png

case3:情况如下图,所谓 triangle 型即 Z 和 Z 的父结点及爷爷结点形成三角形型:

f08efcd7fd5873336a189e6152518343.png

遇到这种情况时候,我们需要对 Z 的父结点进行 Z 的相反方向旋转,如 Z 为左孩子,则将 A 向右旋转

dcf78d52b280062a4984f4cc51999825.png

case4:情况如下图,同理,line 型即 Z 和 Z 的父结点及爷爷结点在一条线上:

a9315128618634091af521e6a8ad1886.png

对于这种情况,我们将对 Z 的爷爷结点进行反方向旋转,如 Z 在右子树位置,将对 B 进行左旋。
e15375347e9f5a8c70f0ba5308798b69.png

然后再对其原父结点和原爷爷进行重新着色。
6843eb1ddfec467a4da1fd0c868ab396.png


故对之前的 4 种情况,我们的处理分别为:

  1. 插入 Z 为根结点  ➡ 置黑

  2. Z 的叔叔结点为红色    ➡ 重新着色

  3. Z 的叔叔结点为黑色,triangle型    ➡ 旋转 Z 的父结点

  4. Z 的叔叔结点为黑色,line型    ➡ 旋转 Z 的爷爷结点并重新着色


一个🌰

以下是一个例子。现在,我们想要往如下红黑树中插入一个15结点:

3507bc630c14d8366466d58367d823c7.png
红黑树初始状态

(1) 首先,将插入的结点放入正确位置,并先另其为红色:

0fea961a8d9651a4c27a420cc8c56863.png
插入结点15

在这里,我们要使用一种方式 —— 将违规行为上移,满足 case2,重新着色三代。此时我们将 8 、11 结点置为黑色,将 10 结点置为红色。

0d0e087ec0e8b9d51882bd546bce9d1f.png
矛盾上移

经过操作后我们可以看到此时的违规行为转移到了 10 与 18 间,10 的叔叔结点为黑色,7 与 18 与 10 呈 triangle 型,满足 case3 ,这时我们要右旋 18 结点。

72a6866995a07bd12f26f6b6bc52ce3f.png
右旋树

此时 7-10-18 构成了 case4 ,我们左旋违规行为起始点 18 的爷爷结点 7,并重新着色,可以得到最终结果。

50c9f9e9587f473e337c3cfba99f665b.png
左旋树

现在这棵树已经是一棵红黑树了。

总结

红黑树的插入操作部分主要的难点在于理解左旋右旋和四种情况的考虑,在下一小节中我们将对删除操作进行详细讲解,并给出所有操作的示例代码。

往期推荐

随机洗牌算法之Knuth-Durstenfeld Shuffle

5f7e31bcf281c567166a192a3f087498.jpeg

a7b0d4acba155bfaeb1fdcf5899d2d3e.png

DC-DC拓扑:从电感位置一眼识别Buck、Boost与Buck-Boost 本文详细解析了DC-DC拓扑中电感位置对识别Buck、Boost与Buck-Boost电路的关键作用。通过对比不同拓扑的电感连接特征,提供快速识别方法和设计要点,帮助工程师避免常见错误并优化电路性能。特别强调电感位置对输出质量和效率的影响,适合电源设计人员参考。 阅读详情

相关推荐

Pinocchio 结合 CasADi 进行 IK 逆运动学及 Mujoco 仿真

摘要:本视频演示了如何利用Pinocchio和CasADi实现机械臂逆运动学(IK)求解,并在Mujoco中进行仿真。通过构建优化问题(最小化位姿误差),结合IPOPT求解器对机械臂关节角度进行优化。代码支持导入URDF/MJCF模型,并以so100机械臂为例,实现了末端执行器位置跟踪的仿真测试。关键步骤包括:建立平移/旋转误差函数、设置约束条件、调用CasADi求解,最终在Mujoco中实时更新关节状态完成运动控制。

darcsdn 1004

数据结构-----红黑树的插入

在数据结构当中,旋转操作是一种很常见的操作,可能去实现数据结构平衡或者其他相关特性的要求,同样的的AVL树和红黑树里边也是要进行旋转操作的,通过旋转来满足平衡的特性。旋转分两种:左旋(Left Rotation)和右旋(Right Rotation)

m0_73633088的博客 2286

STM32G474多通道ADC电压采集:软件触发与单次转换实战

本文详细介绍了STM32G474多通道ADC电压采集的实战方法,重点讲解了软件触发与单次转换的实现技巧。通过硬件设计、HAL库配置、多通道轮询采集及数据处理等环节的详细解析,帮助开发者高效完成精确电压采集任务。文章还提供了常见问题调试技巧和性能优化建议,适用于需要高精度电压监测的嵌入式应用场景。

weixin_28720767的博客 465

CD80.【C++ Dev】模拟实现红黑树的插入

本文主要介绍了红黑树的插入操作实现。首先回顾了红黑树的性质,包括根节点和空节点为黑色、无连续红节点、每条路径黑节点数相同等。然后对比了AVL树和红黑树的特性差异,指出红黑树通过牺牲部分平衡性换取更好性能。重点讲解了插入节点的三种情况处理:1)当uncle节点为红色时进行变色处理;2)当uncle节点为黑色或不存在时进行旋转操作;3)详细分析了各种旋转情况下的抽象图例。最后给出了红黑树插入操作的代码实现框架,包括节点结构、插入函数和测试方法。文章强调红黑树通过颜色标记和旋转操作来维持平衡,相比AVL树具有更好

zhangcoder的博客 记录学习轨迹~ 889

Skynet 框架面试题

本文整理了游戏服务端开发面试中 Skynet 框架的高频考点,涵盖底层架构、消息派发、协程调度、网络 I/O、harbor 跨机通信、内存管理、socket 处理、阻塞操作、错误处理等核心内容。全面覆盖 Skynet 框架的原理、使用和实战问题,追求深入准确,拒绝八股文。

小赖的博客 383

oVirt 4.4.10超详细安装指南:从零搭建企业级虚拟化环境(附常见错误排查)

本文提供了oVirt 4.4.10企业级虚拟化平台的超详细安装指南,涵盖环境规划、系统准备、Engine安装配置、计算节点部署、存储系统集成及高级运维技巧。通过实战操作手册和常见错误排查方法,帮助用户从零搭建稳定高效的虚拟化环境,特别适合企业IT管理员参考实施。

wasm7browser的博客 351

数据结构 —— 红黑树:图解插入示例

文章目录1、说明2、插入过程3、最终结果 1、说明 将下列数 12、1、9、2、0、11、7、19、4、15、18、5、14、13、10、16、6、3、8、17 20个数,插入到红黑树中。 2、插入过程 (1)插入12 说明:插入的节点若是根节点,则直接将其设置为黑色 (2)插入1 说明:插入的节点若不是根节点,则将其设置为红色 (3)插入9 (4)插入2 (5)插入0 (6)插入11......

猎人在吃肉 1470

TCP Reno/CUBIC 拥塞控制算法对比:从 Tahoe 到 BBR 的 4 种核心策略演进

本文深入解析了TCP拥塞控制算法的演进历程,从经典的Tahoe、Reno到现代的CUBIC和BBR,详细对比了4种核心策略的实现机制与性能差异。通过分析拥塞窗口、流量控制等关键技术,揭示了不同算法在高带宽延迟网络中的优化方向,为网络协议栈优化提供理论依据和实践指导。

weixin_33725239的博客 442

红黑树 B-树 B树 B+树

红黑树:一种不要求绝对平衡的二叉树。 B树:多叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点; B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中; B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点...

jojozym的博客 420

如何利用ADS中的耦合线设计带通滤波器并转换为HFSS模型

耦合线带通滤波器是一种常用的微带滤波器形式,由多个长度为四分之一波长的耦合线节组成,在所需频点形成谐振,构成滤波器的频率响应特性。首先我们先来了解一下耦合线带通滤波器的电路结构,见下图:包括两对耦合线,中间为公共连接点,其中两对耦合线的偶奇模阻抗为(Z1e,Z1o)和(Z2e,Z2o,端口输入阻抗为Z0)。2.指定一个初始奇偶模值,ADS优化出一个合适的结果,通过奇偶模值利用linecalc工具计算出微带耦合线尺寸。假设中心频率为2GHz,则对应频点的电长度为。5.运行结果,两个软件仿真结果基本一致。

auqihc的博客 2230

情感分析在金融领域的应用:舆情影响股价预测

我们都知道,股价的波动受到多种因素的影响,而大众的情绪和看法就是其中很重要的一部分。我们在日常生活中都有根据别人的评价来判断事物好坏的经验,在金融市场里,舆情就像是大众对某家公司的集体评价,它能反映出市场参与者的情绪和预期。学习这方面的知识,能帮助投资者更好地把握市场动态,做出更明智的投资决策,无论是个人投资者还是金融机构的分析师,都能从中受益。有一天,你看到某家知名企业被曝光了严重的产品质量问题,新闻铺天盖地,股民们也都在热议纷纷,负面情绪弥漫。这时,你会不会觉得这家公司的股价可能要下跌了呢?

AI 原生应用开发的博客 1147

红黑树原理讲解

红黑树原理讲解 |—红黑树的性质 |—红黑树有几种变化策略?(为满足红黑树性质) |—改变颜色 |—左旋 |—右旋 |—红黑树的查找 |—红黑树的插入 |—情景1:红黑树为空树 |—情景2:插入节点的key已经存在 |—情景3:插入节点的父节点为黑色 |—情景4:插入节点的父节点为红色 |—情景4.1:叔叔节点存在,并且为红色(父-叔 双红) |—情景4.2:叔叔节点不存在,或者为黑色,父节点为爷爷节点的左子树 |—情景4.2.1:插入节点为其父节点的左子节点(LL情况) |—情景4.2.2:插入节点为其父

冲冲冲的博客 1347

74、光谱成像在电子内窥镜及色彩理论中的应用

本文探讨了光谱成像在电子内窥镜中的应用及其与色彩理论的深度融合。通过分析FICE技术、色彩再现模型及胃黏膜光谱测量,展示了光谱信息在提升医学诊断准确性方面的潜力。同时,系统阐述了颜色的物理属性、标准表示方法、同色异谱现象、颜色测量技术(密度法与比色法)以及CIELAB等均匀颜色空间的构建原理。结合流程图与对比表格,梳理了从光信号获取到颜色处理的完整路径,并展望了人工智能与新型视觉模型在未来医疗成像与色彩科学中的发展方向。

g2h3i4j5的博客 153

关键路径例题图解_图解!九大常见数据结构被24张图给安排的明明白白

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数据结构种类繁多,本文将通过图解的方式对常用的数据结构进行理论上的介...

weixin_39662432的博客 1832

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

图解!九大常见数据结构被24张图给安排的明明白白!

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。 常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数据结构种类繁多,本文将通过图解的方式对常用的数据结构进行理论上的介绍和讲解,以方便大家掌握常用数据结构的基本知识。 本文提纲 1 数组 数组可以说是最基本最常见的数据结构

weixin_47083537的博客 323

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

24张图,九大数据结构安排得明明白白

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。 常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数据结构种类繁多,本文将通过图解的方式对常用的数据结构进行理论上的介绍和讲解,以方便大家掌握常用数据结构的基本知识。 1 数组 数组可以说是最基本最常见的数据结构。数组一般

m0_67778103的博客 226

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

图解!九大常见数据结构被24张图给安排的明明白白!,程序员Java基础入门第二版pdf

分布式技术专题+面试解析+相关的手写和学习的笔记pdf还有更多Java笔记分享如下:[外链图片转存中…(img-Gl5mUDmv-1711103593184)]由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)[外链图片转存中…(img-CzG9T6FD-1711103593184)]分布式技术专题+面试解析+相关的手写和学习的笔记pdf。

m0_60607371的博客 628

24张图,九大数据结构安排得明明白白!

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数据结构种类繁多,本文将通过图解的方式对常用的数据结构进行理论上的介绍和讲解,以方便大家掌握常用数据结构的基本知识。

qq_39093474的博客 222

HashMap 扩容原理详解:触发条件、源码图解与性能优化(JDK 8-17)

本文深入解析HashMap扩容机制,从触发条件、扩容过程到性能优化进行全面拆解。关键点包括:扩容触发于size超过容量×负载因子(默认0.75);扩容时容量翻倍,通过位运算高效重定位元素;链表按hash值拆分为两段迁移;树化需同时满足链表长度≥8和容量≥64。文章还给出实战建议:合理预估初始容量避免频繁扩容,多线程环境使用ConcurrentHashMap,以及重写key的hashCode()保证哈希分布。理解这些原理能有效优化HashMap性能,也是Java面试的重要考点。

2401_88179843的博客 298

红黑树原理剖析,小白白,专属,C++

将红黑树15种情况压缩成插入3种,删除两种情况。插入看祖父节点,删除看父节点,同时合并度为1,以及度为0的插入与删除的调整,度为2的找前驱和后继,我写的找前驱,同时对处理失衡时采用红色上浮的一个调整策略(当然黑色下沉也是可以的),同时巧妙的处理了双黑情况。这里的空地址我采用了一个虚拟空节点,这样就不会造成程序崩溃了,详情请看代码 #include #include #include using namespace std; struct node { int key, color;// color = 0

m0_56418767的博客 145

红黑树的插入过程(图解)

红黑树是一种自平衡的二叉查找树它具有以下5个性质:1、节点颜色必须是红色或者黑色2、根节点是黑色3、每个叶子节点(NIL节点、空节点)是黑色的4、每个红色节点的两个子节点都是黑色5、从任一节点到每个叶子的所有路径都包含数目相同的黑色节点上图就是一颗红黑树,所有的空节点都指向最后这个黑色节点,称它为哨兵节点,从根节点沿任一路径出发到达哨兵节点,路径上的黑色节点总数是相同的。了解完红黑树的基本性质,我...

Lyt15829797751的博客 1万+
上一篇: Gin(十五):JWT使用续
下一篇: 程序员送女朋友的新年礼物
代码猎奇站
博客等级 码龄7年 39粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值