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

命为志存。 —— 朱熹


红黑树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.mfbz.cn/a/783930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LabVIEW学习篇 - 1】:初始LabVIEW

文章目录 初始LabView前面板和程序框图前面板&#xff08;Front Panel&#xff09;程序框图&#xff08;Block Diagram&#xff09;交互和工作流程 练手小案例&#xff1a;LabView中实现加法操作 初始LabView LabVIEW&#xff08;Laboratory Virtual Instrument Engineering W…

数据要素资产化路径

一、数据治理&#xff1a;包括数据规范管理、数据治理管理、元数据管理、数据架构管理。 二、数据资产运营&#xff1a;包括数据目录视图、数据全生命周期、数据资产估值、数据资产定价、数据交易流通。 方向1&#xff1a;产业数字化&#xff08;难度系数&#xff1a;*&#…

出现d3dcompiler_43.dll缺失我们要怎么修复?教你科学修复d3dcompiler_43.dll

出现d3dcompiler_43.dll缺失其实也算是一种比较常见的dll文件丢失&#xff0c;毕竟现在很多在使用电脑的时候&#xff0c;都会胡乱的下载东西&#xff0c;然后导致电脑中毒&#xff0c;感染到d3dcompiler_43.dll文件&#xff0c;而导致d3dcompiler_43.dll文件被损坏&#xff0c…

docker安装oracle 11g

最近把一些常用数据库都移到docker了&#xff0c;而且是windows下&#xff0c;很是方便。偶尔还是要用一下Oracle&#xff0c;今天就试一下安装oracle 11g 在docker上。 一、搜索并拉取镜像 docker search oracle_11gdocker pull iatebes/oracle_11g二、运行容器和测试连接 …

微信小程序开发-003-首页(轮播图,状态栏,导航栏)

哈喽小伙伴们大家好,我是程序媛小李,今天,我们继续来开发微信小程序. 在这里,先贴上首页的效果图: 整个页面大概可以分为顶部的状态栏区域,轮播图区域,公司信息区域,商品导航区域,商品推荐区域,以及最下面的导航栏区域. 一,底部导航栏 在这里,我们遵循从外到内的原则,我们先来…

小白·使用Tesseract-OCR工具读取图片

1、直接pip安装 工具使用vscode和pycharm都可以。 这里介绍使用vscode的方法。 (1)、调出终端 (2)、安装依赖 (3)、编写代码 import pyocr import pyocr.builders from PIL import Image import re# 获取Tesseract-OCR工具 tools pyocr.get_available_tools() tool tools[…

数据融合工具(3)国家基本比例尺地形图分幅计算

情景再现&#xff0c;呼叫小编 数据获取和使用过程中&#xff0c;经常听到一个名词“分幅图幅号”…… 你的数据是按多大比例尺分幅的&#xff1f;我不知道&#xff0c;就一些字母和数值。 你把G47E018018范围内的数据裁剪提供&#xff0c;这个范围是啥&#xff1f; 你把镶嵌…

Android14之获取包名/类名/服务名(二百二十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

常见的自动化工具开发必备的源代码!

随着科技的飞速发展&#xff0c;自动化工具已经成为我们日常工作中不可或缺的一部分&#xff0c;自动化工具不仅极大地提高了工作效率&#xff0c;还降低了人为错误的可能性。 然而&#xff0c;要想开发出高效、稳定的自动化工具&#xff0c;掌握一些常见的源代码技巧是至关重…

新手入门:无服务器函数和FaaS简介

无服务器&#xff08;Serverless&#xff09;架构的价值在于其成本效益、弹性和扩展性、简化的开发和部署流程、高可用性和可靠性以及使开发者能够专注于业务逻辑。通过自动化资源调配和按需计费&#xff0c;无服务器架构能够降低成本并适应流量变化&#xff0c;同时简化开发流…

【版面费优惠丨ACM独立出版丨接受全文摘要投稿】2024年生物医药和智能技术国际学术会议(ICBIT 2024,8月23-25)

“2024年生物医药和智能技术国际学术会议&#xff08;ICBIT 2024&#xff09;”拟定于2024年8月23-25日于珠海召开。近年来&#xff0c;智能技术已经逐渐走入生物医药领域&#xff0c;并在与生物医药领域的融合创新中凸显出巨大的发展潜力和社会价值。人工智能技术在生物医药领…

工业电脑一体机在高清视频处理中的应用

工业电脑一体机在高清视频处理中的应用广泛&#xff0c;尤其是在需要高性能计算、稳定性和实时处理能力的场景中。以下是工业电脑一体机在高清视频处理中的具体应用&#xff1a; 视频监控与分析&#xff1a; 工业电脑一体机能够处理多个高清视频流&#xff0c;实现实时监控&a…

Stable-diffusion 4.8大模型与Lora

SD大模型与Lora、生成这些图片提示词。下载地址如下。 地址链接&#xff1a;https://pan.baidu.com/s/1rJaH7VvyiBYas9zopj-pFA?pwdzgma 提取码&#xff1a;zgma 一、这是SD压缩文件&#xff0c;双击后进行解压 二、解压后&#xff0c;可以看到一堆文件夹与文件&#xff0c…

【分布式系统】注册中心Zookeeper

目录 一.Zookkeeper 概述 1.Zookkeeper 定义 2.Zookkeeper 工作机制 3.Zookkeeper 特点 4.Zookkeeper 数据结构 5.Zookkeeper 应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 6.Zookkeeper 选举机制 第一次启动选举机制 非第一次…

小白学C++(第一天)基础入门

温馨提醒&#xff1a;本篇文章&#xff0c;请各位c基础不行的童鞋不要贸然观看 C的第一个程序 第一个关键字namespace namespace 是定义空间的名字的关键字&#xff0c;使用格式格式如下&#xff1a; namespace 空间名 { } 其中{ }内的命名空间的成员&#xff0c;可以定义…

分销密文下单

背景 事情的经过就是今天早上一共下了10个单&#xff0c;然后就下不了单了。 如下图&#xff1a; 来到抖店后台显示什么解密额度已经用完了 所以&#xff0c;今天必须把困扰我很久的分销密文下单解决掉 操作 1688分销下单-逸淘订单 1 先关联商品 2 下单 首页导航栏--1688分…

单元测试工具TESSY 新版本亮点速览:提供测试驾驶舱视图、超级覆盖率、代码访问分析、增强覆盖率审查

TESSY最新版本v5.1现已发布&#xff01; 该版本可用于Windows和Linux&#xff0c;并提供各种有趣的新功能。一个突出的新功能是新的“测试驾驶舱视图”&#xff0c;它可用于从整个软件中确定要测试的源代码文件&#xff0c;汇总来自各种测试对象和方法的所有覆盖率测量结果&am…

【MySQL】Mysql数据库导入导出sql文件、备份数据库、迁移数据库

本文摘要&#xff1a;本文提出了xxx的实用开发小技巧。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&…

Linux:进程终止和进程替换

Linux&#xff1a;Linux&#xff1a;进程终止和进程替换 一、进程终止1.1 进程退出场景和创建退出方式 1.2 exit 和 _exit区别二、进程程序替换2.1 进程替换函数2.2 函数解释及命名解释函数解释命名解释 2.3 单进程程序替换&#xff08;无子进程&#xff09;2.3.1 带l函数进程替…

C++规范

一、VS工具集列表&#xff1a; Visual Studio 2008&#xff1a;v90 Visual Studio 2010&#xff1a;v100 Visual Studio 2012&#xff1a;v110 Visual Studio 2013&#xff1a;v120 Visual Studio 2015&#xff1a;v140 &#xff08;v140_xp&#xff09; Visual Studio 2017&a…