红黑树知识点回顾

news2025/1/11 8:14:47

Rudolf Bayer 于1978年发明红黑树,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树

红黑树具有良好的效率,它可在近似O(logN) 时间复杂度下完成插入、删除、查找等操作,因此红黑树在业界也被广泛应用,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的。

1. 2-3树与红黑树的等价性

红黑树规则

1. 根节点是黑色
2. 节点是红黑或者黑色
3. 所有子叶节点都是黑色(叶子是NIL节点,默认没有画出来)
4. 每个红色节点必须有两个黑色子节点(也同样说明一条链路上不能有链路的红色节点)
5. 从任一节点到齐每个叶子节点,经过的路径都包含相同数目的黑色节点

那么,这些规则是怎么总结定义出来的呢?接下里我们一步步分析讲解。

1.1 为什么既有2-3树要有红黑树

首先 2-3树 (读法:二三树)就是一个节点有1个或者2个元素,而实际上2-3树转红黑树是由概念模型 2-3-4树 转换而来的。-4叉 就是一个节点里有3个元素,这在 2-3树 中会被调整,但是在概念模型中是会被保留的。

虽然 2-3-4树 也是具备 2-3树 同样的平衡树的特性,但是如果直接把这样的模型用代码实现就会很麻烦,且效率不高,这里的复杂点包括;

  1. 2-叉、3-叉、4-叉,三种结构的节点类型,互相转换复杂度较高
  2. 3-叉、4-叉,节点在数据比较上需要进行多次,不像2-叉节点,直接布尔类型比较即可非左即右
  3. 代码实现上对每种差异,都需要有额外的代码,规则不够标准化

所以,希望找到一种平衡关系,既保持2-3树平衡和O(logn)的特性,又能在代码实现上更加方便,那么就诞生了红黑树。

1.2 简单2-3树转红黑树

2-3树 转红黑树,也可以说红黑树是 2-3树2-3-4树 的另外一种表现形式,也就是更利于编码实现的形式。

简单转换示例

在这里插入图片描述

从上图可以看出,2-3-4树与红黑树的转换关系,包括:

  1. 2-叉节点,转换比较简单,只是把原有节点转换为黑色节点。
  2. 3-叉节点,包括了2个元素,先用红色线把两个节点相连,之后拆分出来,最后调整高度黑色节点在上。
  3. 4-叉节点,包括了3个元素,分别用红黑线连接,之后拆分出来拉升高度。这个拉升过程和2-3树调整一致,只是添加了颜色。

综上,就是 2-3-4树 的节点转换,总结出来的规则,如下;

  1. 2-3-4树 ,用二叉树的形式表示。
  2. 3-叉、4-叉节点,使用红色、黑色连线进行连接。
  3. 另外,3-叉节点有两种情况,导致转换成二叉树,就有左倾和右倾。

1.3 复杂2-3树转红黑树

简单2-3树转换红黑树 的过程中,了解到一个基本的转换规则右旋定义,接下来我们在一个稍微复杂一点的 2-3树 与红黑树的对应关系,如下图:

在这里插入图片描述

上图是一个稍微复杂点的2-3树,转换为红黑树的过程,是不这样一张图让你对红黑树更有感觉了,同时它也满足一下条件;

  1. 从任意节点到叶子节点,所经过的黑色节点数目相同
  2. 黑色节点保持着整体的平衡性,也就是让整个红黑树接近于O(logn)时间复杂度
  3. 其他红黑树的特点也都满足,可以对照红黑树的特性进行比对

2. 红黑树

2.1 平衡操作

通过在2-3树的学习,在插入节点时并不会插到空位置,而是与现有节点融合以及调整,保持整个树的平衡。

而红黑树是2-3-4树的一种概念模型转换而来,在插入节点时通过红色链接相连,也就是插入红色节点。插入完成后进行调整,以保持树接近平衡。

那么,为了让红黑树达到平衡状态,主要包括染色、↔左右旋转、这些做法其实都是从2-3树演化过来的。接下来我们就分别讲解几种规则的演化过程,以此更好了解红黑树的平衡操作。

2.1.1 左旋转

左旋定义: 把一个向右倾斜的红节点链接(2-3树,3-叉双元素节点),转化为左链接。

在这里插入图片描述

背景:顺序插入元素,1、2、3,2-3树保持平衡,红黑树暂时处于右倾斜。

接下来我们分别对比两种树结构的平衡操作;

  1. 2-3树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。
  2. 红黑树,则需要通过节点的左侧旋转,将元素2拉起来,元素1和元素3,分别成为左右子节点。

红黑树的左旋,只会处理与之对应的2-3树节点进行操作,不会整体改变。

2.1.2 右旋转

右旋定义: 把一个向左倾斜的红节点连接(2-3树,3-叉双元素节点),转换为右连接。

在这里插入图片描述

背景:顺序插入元素,3、1、1,2-3树保持平衡,红黑树暂时处于左倾斜。

接下来我们分别对比两种树结构的平衡操作:

  1. 2-3树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。
  2. 红黑树,则需要通过节点的右侧旋转,将元素2拉起来,元素1和元素3,分别成为左右子节点。

你会发现,左旋与右旋是相互对应的,但在2-3树中是保持不变的

2.1.3 左右旋综合运用

左旋、右旋,我们已经有了一个基本的概念,那么接下来我们再看一个可以综合左右旋以及对应2-3树的演化案例,如下:

在这里插入图片描述

以上的例子分别演示了一个元素插入的三种情况,如下:

  1. 1、3,插入0,左侧底部插入,与2-3树相比,需要右旋保持平衡
  2. 1、3,插入2,中间位置插入,首先进行左旋调整元素位置,之后进行右旋进行树平衡
  3. 1、3,插入5,右侧位置插入,此时正好保持树平衡,不需要调整

2.1.4 染色

在2-3树中,插入一个节点,为了保持树平衡是不插入到空位置上的,当插入节点后元素数量有3个后则需要调整中间元素向上,来保持树平衡。与之对应的红黑树则需要调整颜色,来保证红黑树的平衡规则,具体参考如下:

在这里插入图片描述

2.2 旋转+染色运用案例

接下来我们把上面讲解到的旋转染色,运用到一个实际案例中,如下图:

在这里插入图片描述

  • 首先从左侧开始,是一个按照顺序插入生产出来的红黑树,插入顺序 7、2、8、1、4、3、5
  • α,向目前红黑树插入元素6,插入后右下角有三个红色节点 3、5、6
  • β,因为右下角满足染色条件,变换后:黑色节点(3、5)、红色节点(4、6)。
  • γ,之后看被红色连线链接的节点 7、4、2,最小节点在中间,左旋平衡树结构。
  • δ,左旋完成后,红色链接线的 7、4、2 为做倾顺序节点,因此需要做右旋操作。
  • ε,左旋、右旋,调整完成后,又满足了染色操作。到此恢复红黑树平衡。

注意,所有连接红色节点的,都是是红色线。以此与2-3树做对应。

2.3 删除操作

根据2-3-4树模型的红黑树,在删除的时候基本是按照2-3方式进行删除,只不过在这个过程中需要染色和旋转操作,以保持树平衡。删除过程主要可以分为如图四种情况,如下:

在这里插入图片描述

2.3.1 删除子叶红色节点

红色子叶节点的删除并不会破坏树平衡,也不影响树高,所以直接删除即可,如下:

在这里插入图片描述

2.3.2 删除左侧节点

2.3.2.1 被删节点兄弟为黑色&含右子节点

在这里插入图片描述

2.3.2.2 被删节点兄弟为黑色&含左子节点

在这里插入图片描述

2.3.2.3 被删节点兄弟为黑色&含双子节点(红)

在这里插入图片描述

2.3.2.4 被删节点兄弟为黑色&不含子节点

在这里插入图片描述

2.3.2.5 被删节点兄弟为黑色&含双黑节点(黑)

在这里插入图片描述

2.3.3 删除右侧节点

2.3.3.1 被删节点兄弟为黑色&含左子节点

在这里插入图片描述

2.3.3.2 被删节点兄弟为黑色&含右子节点

在这里插入图片描述

2.3.3.3 被删节点兄弟为黑色&含双子节点(红)

在这里插入图片描述

2.3.3.4 被删节点兄弟为黑色&不含子节点

在这里插入图片描述

2.3.3.5 被删节点兄弟为黑色&含双黑节点(黑)

在这里插入图片描述

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

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

相关文章

实验五、任意N进制异步计数器设计

实验五 任意N进制异步计数器设计 实验目的 掌握任意N进制异步计数器设计的方法。 实验要求 一人一组,独立上机。在电脑上利用Multisim软件完成实验内容。 实验内容 说明任意N进制异步计数器的构成方法 设计过程 集成计数器一般都设有清零端和置数输入端&#xff…

3.7动态规划--图像压缩

3.6多边形游戏,多边形最优三角剖分类似,仅仅是最优子结构的性质不同,这个多边形游戏更加具有一般性。不想看了,跳过。 写在前面 明确数组含义: l: l[i]存放第i段长度, 表中各项均为8位长,限制了相同位数…

ElasticSearch - RestClient操作ES基本操作

目录 什么是RestClient hotel数据结构分析 初始化RestClient 创建索引库 删除索引库 判断索引库是否存在 小结 新增文档 查询文档 更新文档 删除文档 批量导入文档 小结 什么是RestClient ES官方提供了各种不同语言的客户端,用来操作ES这些客户端的本质…

Java基础语法——方法

目录 方法概述 方法定义及格式 方法重载 •方法重载概述 •方法重载特点 方法中基本数据类型和引用数据类型的传递 方法概述 ——假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码&…

五、在测试集上评估图像分类算法精度(Datawhale组队学习)

文章目录配置环境准备图像分类数据集和模型文件测试集图像分类预测结果表格A-测试集图像路径及标注表格B-测试集每张图像的图像分类预测结果,以及各类别置信度可视化测试集中被误判的图像测试集总体准确率评估指标常见评估指标混淆矩阵PR曲线绘制某一类别的PR曲线绘…

密码学的100个基本概念

密码学的100个基本概念一、密码学历史二、密码学基础三、分组密码四、序列密码五、哈希函数六、公钥密码七、数字签名八、密码协议九、密钥管理十、量子密码2022年主要完成了密码学专栏的编写,较为系统的介绍了从传统密码到现代密码,以及量子密码的相关概…

C语言函数声明以及函数原型

C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。所谓声明(Declaration),就是告诉编译器…

《网络编程实战》学习笔记 Day9

系列文章目录 这是本周期内系列打卡文章的所有文章的目录 《Go 并发数据结构和算法实践》学习笔记 Day 1《Go 并发数据结构和算法实践》学习笔记 Day 2《说透芯片》学习笔记 Day 3《深入浅出计算机组成原理》学习笔记 Day 4《编程高手必学的内存知识》学习笔记 Day 5NUMA内存知…

【论文翻译】Non-local Neural Networks

摘要 卷积运算和循环运算都是每次处理一个局部邻域的构建块。在本文中,我们将非局部操作作为一组用于捕获长期依赖关系的构建块。受计算机视觉中经典的非局部均值方法[4]的启发,我们的非局部运算将一个位置的响应计算为所有位置特征的加权和。这个构建块…

「自控原理」5.2 频域稳定判据、频域分析

本节介绍奈奎斯特稳定判据、对数稳定判据,并引入稳定裕度 本节介绍频率特性法分析系统性能 本节介绍通过开环频率特性得到闭环频率特性的方法 文章目录频域稳定判据奈奎斯特稳定判据ZP−2NZP-2NZP−2N奈奎斯特稳定判据的推导对数稳定判据容易判断出错的情况临界稳定…

第九层(4):STL之duque类

文章目录前情回顾deque类deque类的功能deque和vector的区别deque容器的内部图deque类内的构造函数deque类内的赋值操作deque类内的大小操作deque类内的插入操作deque类内的删除操作deque类内的单个访问下一座石碑🎉welcome🎉 ✒️博主介绍:一…

设计模式 - 创建型模式_原型模式

文章目录创建型模式概述Case场景模拟⼯程Bad ImplBetter Impl (原型模式重构代码)创建型模式 创建型模式提供创建对象的机制, 能够提升已有代码的灵活性和可复⽤性。 类型实现要点工厂方法定义⼀个创建对象的接⼝,让其⼦类⾃⼰决…

AcWing蓝桥杯AB组辅导课08、数论

文章目录前言一、数论例题例题1:AcWing 1246. 等差数列(最大公约数,第十届蓝桥杯省赛CB第7题)分析题解:最大公约数例题2:AcWing 1295. X的因子链(算数基本定理、欧拉筛选,多重集合排…

打工人必知必会(四)——股票期权属于劳动争议吗

目录 参考 一、核心概览 二、 注意 三、更多案例 参考 案例评析:股票期权纠纷是否属于劳动争议 股票期权(限制性股票)相关劳动争议问题 北上广深杭案例 一、核心概览 二、 注意 结合双方股权激励协议的签署背景、目的等因素来综合考量并作出相对准…

【数据结构】8.1 排序概述

文章目录排序的基本概念排序方法的分类存储结构排序的基本概念 什么是排序? 排序:将一组杂乱无章的数据按照一定规律顺次排列起来。 即,讲无序序列排成一个有序序列(有小到大或由大到小)的运算。 如果参加排序的数据…

MicroPython开发ESP8266——环境搭建

MicroPython开发ESP8266——环境搭建0.前言一、固件烧写1.使用乐鑫官方的烧写工具2.使用python中的esptool工具烧写3.使用uPyCraft烧写4.测试二、IDE工具安装1.windows环境搭建2.Linux环境搭建3.测试1)软件设置2)测试程序3)烧录0.前言 最近刷…

NLP 语种检测 API 数据接口

NLP 语种检测 API 数据接口 180 语言检测,语种全称与缩写,返回置信度。 1. 产品功能 基于 NLP 分析文本的语种支持 180 多语种检测;语种缩写遵循 ISO 639-1 标准;包含检测到的语种置信度;毫秒级响应性能;…

Java 代码ccflow 代码分析

流程属性目录概述需求:设计思路实现思路分析1。代码流程参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. ha…

Linux中详解编译原理每一步

引言: 时间过的飞快,可以看出我们已经开始学习Linux了,但是我们学习Linux过程中,依然会涉及到很多的以前的知识,比如编译原理,我们的代码如何从一个源文件逐步变成一个可执行文件,当初我记得我…

流批一体计算引擎-8-[Flink]的Table API连接器

参考官方文档Table API连接器 1 Table API连接器概述 Flink的Table API和SQL程序可以连接到其他外部系统,用于读取和写入批处理表和流式表。source表提供对存储在外部系统(如数据库、键值存储、消息队列或文件系统)中的数据的访问。sink表将…