暑假提升(3)[平衡二叉树之二--红黑树]

news2024/9/28 3:21:28

命为志存。 —— 朱熹


红黑树RBTree

  • 1、诞生原因
  • 2、红黑树的概念
  • 3、红黑树的性质
  • 4、红黑树的设计
    • 4、1、节点设计
    • 4、2、插入操作的设计
  • 5、总结

1、诞生原因

由于二叉树的局限性,进一步出现平衡二叉树,来帮助我们来进一步提升我们对数据的处理,根据之前的文章,我能够理解其中的一种平衡二叉树(AVL树)能够帮助我们解决退化的问题。由于诞生原因那篇文章中讲过了,这里就不再赘述,所以接下来直接介绍红黑树其本身的概念和知识点,在最后还会讲一些一些关于红黑树的模拟实现

2、红黑树的概念

红黑树,也是一种二叉搜索树,但是每一个节点上增加一个存储位置来表示节点的颜色。这又就是红黑树顾名思义,每一个节点存在着一个颜色来表示一个特征。为什么是红黑两种颜色,首先颜色种类无所谓,是两种都是可以的,其次选择两种颜色的原因还是因为在后续的控制树的树枝的时候能够保证一个节点的左右子树之间高度的绝对值差不会太大,保证树的接近平衡。所以通过对任意一条从根到叶子结点的路径上个个节点的着色限制,来保证红黑树确保没有一条路径会比其他路径长出两倍。

3、红黑树的性质

1、每一个节点不是红色就是黑色
2、根节点是黑色的
3、如果一个节点是红色的,那么他的孩子节点是黑色的(没代表黑色节点的孩子节点一定要是红色还是黑色)
4、对于每个节点,从该节点到所有后代叶节点的简单路径上,所包含黑色节点的个数相同
5、每个叶子结点都是黑色的(规定所有的叶子结点都是空节点)

所以根据上面的条件,能够推理出最长的路径一定是尽量的满足黑红黑红的排序方式,最短的路径一定是尽量满足“嘿嘿嘿”的排序方式。
所以在这样的要求之下,红黑树就是具有着能够优化二叉搜索树的特点。
那么,所以,红黑树虽然在规则上满足了能够解决二叉搜索树的缺点,那么插入的时候是如何实现的呢?
接下来我们来介绍一下。

4、红黑树的设计

4、1、节点设计

节点设计不难理解,如果是我的上一篇文章中看到这里的话,理解了AVLTreeNode的设计之后,想到RBTreeNode的结构和细节应该不成问题。
首先,可以先回顾一下AVLTreeNode的代码

template<class T>
struct AVLTreeNode
 {
 	AVLTreeNode(const T& data)
     : _pLeft(nullptr), _pRight(nullptr), _pParent(nullptr)
      ,_data(data), _bf(0)
    {}
 	AVLTreeNode<T>* _pLeft;   // 该节点的左孩子
	AVLTreeNode<T>* _pRight;  // 该节点的右孩子
	AVLTreeNode<T>* _pParent; // 该节点的双亲
	T _data;
    int _bf; 
};

那么关于RVBTreeNode的大概形式和上一个相同,但是不同的就是这次里面还要加上颜色的成员来帮助我们实现节点。

enum Colour
{
	RED,
	BLACK
};

template<class K, class V>
struct RBTreeNode
{
	RBTreeNode<K, V>* _left;
	RBTreeNode<K, V>* _right;
	RBTreeNode<K, V>* _parent;

	pair<K, V> _kv;
	Colour _col;

	RBTreeNode(const pair<K, V>& kv)
		:_left(nullptr)
		, _right(nullptr)
		, _parent(nullptr)
		, _kv(kv)
		, _col(RED)
	{}
};

红黑树解释:
1、其中红黑颜色怎么在结构体种体现的问题,通过枚举类型来帮助解决。
2、我提供的代码之中,这种结构体的设计是KV的模型
3、在定义的时候利用到模版,方便与其他另外的KV模型的实现和改变。

==反思:==为什么每一个节点的设计都是默认的红色呢?
解答: 根据红黑树的性质来说,在加入节点之后,必须要按照规矩和性质来解决可能出现的一些导致性质出现和实际的红黑树有不同的地方。那么每一个节点的插入之后,必须要调整一下来保证还是能够让整个树都满足条件的。那么红色的默认设计就是会比黑色好得多。因为根据红黑树的性质中来讲的话,其中的条件四更加的严苛,条件三还能够相对而言还能够方便继续修改。 ==所以即使是破坏条件三,也不愿意破坏条件四。==那么,接下来的问题就是,为什么相比较而言,条件还有“谁轻谁重”的概念。==如果是插入红色的节点,可能会破坏条件三(在上一个节点是红色的情况之下的话)只是需要修改一下,从插入的节点向上修改一下,并且这一条路径修改好了之后呢,其余的稍微修改一下就行。(如果想看到底怎么修改,那么就看一下下面插入操作的设计,会包含所有的情况)。那么对于插入黑色节点的情况下,是一定会破坏条件四的,==一条路径上如果是直接加上一个黑色的节点,那么所有的路径之上,之前保持的黑色节点的平衡就不复存在,就需要修改每一个路径之上的所有的红黑节点的分配。
所以,在这样的情况之下的话想对比较而言的话,直接插入红色节点的消耗会比黑色的少很多,也更加容易实现红黑树的插入操作。

为了解决红黑树的插入操作的细节的问题,接下来要具体讲一下关于插入的模拟实现,这样既能够实现插入操作,也能知晓插入的一些注意事项。

4、2、插入操作的设计

与AVLTree树不同的是,没有了平衡因子,只有颜色的成员。那么该怎么合理的解决问题呢?
由于红黑树其实本质上来说就是满足性质的二叉树。所以,在插入的时候,可以大致的分为两种情况(直接分为两种情况是因为这两种情况下的子问题,是能够通过相同的解决方案来解决的)。
哦哦哦!对了,在插入节点的判断开始之前,需要判断一下是否是头节点,如果是头节点的插入的话不需要考虑太多,只需要设置这个节点为头节点并且设置一下节点的颜色,把他设置为黑色的。
接下来先介绍一下前提,cur节点的意思可以宽泛一点的认为是cur以下节点更新完之后的节点,p节点的意思是cur节点的父亲节点,g节点是cur父亲节点的父亲节点,u节点是g节点的孩子节点(不是p节点)
如果是根节点的情况而停止向上的话,那么我们就需要重新的更新一下根节点的颜色,重新变为黑色,因为要满足性质。
情况一: 如果u节点存在并且为红色。
在这里插入图片描述
这就是第一种情况,此时p需要和u一起更新为黑色,然后g再变为红色,判断是否需要继续循环,然后再下一步。是否循环的条件就是p节点为红并且p节点存在就继续向上更新。
情况二: u节点不存在/存在且为黑色。
在这里插入图片描述

在这里插入图片描述

此时这种情况之下只需要进行一次就能够满足条件,所以在编写的时候就是直接break跳出循环。

等等!!!!突然想到!!!
就像是上一篇的介绍AVL树中的一样,其中也有“左左”,“右右”这样的设定啊!那么对于RBTree树来说,该怎么解决?很简单!特别简单只需要旋转一下就行了,旋转完了之后直接就是和图中介绍的一样,进行红黑树的更新就行!

5、总结

学会了AVLTree和RBTree之后,我就可以不再局限于是二叉搜索树,而是可以利用更厉害的数据结构来帮助我们实现数据的优化,针对特殊的数据也能够有不俗的优化。
我们也可以通过这种优化来帮助我们解决一些算法问题,在之后的更新之中会出现类似的解题提升的文章!

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

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

相关文章

模电基础 - 信号的运算和处理

目录 一. 简介 二. 加法 三. 减法 四. 乘法 五. 除法 六. 总结 一. 简介 在模电基础中&#xff0c;信号的运算和处理是非常重要的内容。 信号的运算包括加法、减法、乘法、除法等。通过使用集成运放&#xff0c;可以很容易地实现这些运算。例如&#xff0c;利用反相输入…

【工具分享】I-Wanna-Get-All——主流OA漏洞检测利用工具

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 I-Wanna-Get-All安装方式功能介绍 GitHub项目地址&#xff1a;https://github.com/R4gd0ll/I-Wanna-G…

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中&#xff0c;我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片&#xff0c;并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…

生产力工具|Endnote X9如何自动更新文件信息

一、以EndNote X9.2版本为例&#xff0c;打开EndNote文献管理软件。 二、在菜单栏找到“Edit→Preferences...”&#xff0c;点击打开&#xff0c;弹出一个“EndNote Preferences”窗口。 三、进行设置 在打开的窗口左侧选择“PDF Handing”&#xff0c;右边会出现自动导入文献…

科普文:spring boot中常用的接口、工具栏、注解整理

1.springboot 常用接口 1.1 Aware接口 Spring IOC容器中 Bean是感知不到容器的存在&#xff0c;Aware(意识到的)接口就是帮助Bean感知到IOC容器的存在&#xff0c;即获取当前Bean对应的Spring的一些组件&#xff0c;如当前Bean对应的ApplicationContext等。 1.1.1 Applicati…

顶刊文献阅读及代码复现

前提:每个无人机都有 (i)自己的机载计算机,用于执行控制其自身动作所需的计算 (ii)自己的传感器系统,用于测量相对位置和速度, (iii)自己的通信设备,用于与相邻代理进行数据交换。 模型:短期的排斥力、中间范围的速度一致性和长距离的吸引力

开发工具 之十一 详解 OpenOCD 源码、构建、配合各仿真器使用示例

OpenOCD OpenOCD(Open On-Chip Debugger)是一个开源的跨平台的片上调试器,旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。其工作方式就是代替了原有那些调试适配器提供的相关工具和驱动, 直接通过普通的 USB 驱动访问适配器,进而访问目标硬件。 OpenOCD 是由 D…

【前端】使用chrom浏览器Network,查看前后台数据传输请求

使用chrom浏览器Network查看前后台数据传输请求 写在最前面查看前后台数据传输请求① 首先&#xff0c;打开开发者工具&#xff08;F12&#xff09;打开控制台&#xff0c;切换到Network面板。Network面板右键界面copy ②清空请求log ctrle两次或者点击clear图标 案例展示&…

MySQL日常运维手册

对象创建DDL查询 -- 获取创建 database 的 DDL show create database_name; -- 获取创建 表 的 DDL show create table table_name; -- 获取创建 视图 的 DDL show create view index_name; -- 获取创建 触发器 的 DDL show create trigger trigger_name; -- 获取创建 用…

软件架构之计算机网络

软件架构之计算机网络 第 4 章 计算机网络4.1 网络架构与协议4.1.1 网络互联模型4.1.2 常见的网络协议4.1.3 IPv6 4.2 局域网与广域网4.2.2 无线局域网4.2.3 广域网技术4.2.4 网络接入技术 4.3 网络互连与常用设备4.4 网络工程4.4.1 网络规划4.4.2 网络设计4.4.3 网络实施 4.5 …

分析逆向案例十——逗游网标准sha1加密

网址: aHR0cHM6Ly93d3cuZG95by5jbi9wYXNzcG9ydC9sb2dpbj9uZXh0PWh0dHBzOi8vd3d3LmRveW8uY24vZGFuamkvbGlzdA 分析登陆页面的加密。 返回了两个包&#xff0c;下面明显是登陆包&#xff0c;上面这个也是有用的&#xff0c;一般这种返回两个包的情况。前一个包返回的值一般是登…

JVM 调优常用命令

文章目录 前言JVM 调优常用命令1. JPS2. jmap3. jstat4. jstack5. jinfo6. 常用配置: 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…

C++技能基础:提升C++程序运行效率的方法总结

以下是一些编程方面的建议&#xff0c;目的是为了提升C程序的效率&#xff08;这里的效率以时间为评判标准&#xff09;&#xff0c;欢迎指正和补充 场景&#xff1a;当设计方法时&#xff0c;将方法设计成值传递还是引用或者指针传递建议&#xff1a;当变量所占内存大小与指针…

浏览器出现 502 Bad Gateway的原理分析以及解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 此类问题主要作为疑难杂症 1. 问题所示 2. 原理分析 502 Bad Gateway 错误表示服务器作为网关或代理时&#xff0c;从上游服务器收到了无效的响应 通常出现在充当代理或网关的网络服务器上&#xff0c;例如 Nginx、Apache…

学校同步时钟系统实现考场时间统一协调

在学校的教育教学活动中&#xff0c;考试是一项至关重要的环节。而确保考场时间的统一协调&#xff0c;对于保障考试的公平性、准确性和严肃性具有不可忽视的意义。学校同步时钟系统的出现&#xff0c;为解决这一问题提供了高效而可靠的解决方案。 一、学校同步时钟系统是一种通…

新版Android Studio中设置gradle的JDK版本

旧版android studio 在旧版&#xff08;具体哪个版本号之前搞不清了&#xff09;中设置JDK版本在>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK 新版android studio 某次更新后发现SDK location下找不到Gradle Setting选项…

kei5l中不能跳转到函数定义的原因和个人遇到的问题

快捷键 CTRLK或F12&#xff0c;在选择要查看的函数定义时按下可以查看到&#xff08;文件没问题的情况下&#xff09; 出现不能查看的原因 1&#xff0c;没有设置生成文件信息&#xff08;第一次打开工程常遇到问题&#xff09; 2, 定义函数的代码没有加入工程 解决方式如下…

1.DDR3 SO-DIMM 内存条硬件总结

最近在使用fpga读写DDR3&#xff0c;板子上的DDR3有两种形式与fpga相连&#xff0c;一种是直接用ddr3内存颗粒&#xff0c;另一种是通过内存条的形式与fpga相连。这里我们正好记录下和ddr3相关的知识&#xff0c;先从DDR3 SO-DIMM 内存条开始。 1.先看内存条的版本 从JEDEC下载…

在idea中查看某个接口的所有实现类图

一、选中某个接口右键 ---> Diagrams ---> show Diagrams&#xff0c;然后就会进入一个新的 tab 页&#xff1b; 二、然后在出来的图上选中某个接口右键 ---> show Implementations&#xff0c;就会显示选中接口的所有实现类列表&#xff1b; 三、最后 ctrl A 全部选…

苍穹外卖--完善登录功能:进行MD5加密

目标 TODO&#xff1a;使用MD5加密方式对明文密码。 实现 password DigestUtils.md5DigestAsHex(password.getBytes());