C++ RBTree 理论

目录

这个性质可以总结为

红黑树的最短最长路径

红黑树的路径范围

code

结构

搞颜色

插入

插入逻辑

新插入节点

思考:2. 检测新节点插入后,红黑树的性质是否造到破坏?

解决方法

变色

旋转+变色

第三种情况,如果根节点上面还有节点


这个性质可以总结为

1.每个节点不是红色就是黑色

2.根节点是黑色的

3.不能有两个连续的红色节点  ,即可以出现 红黑  黑黑 不能出现红红

4.每条路径上的黑色机节点数量不一样

至于性质5:每个叶子结点都是黑色的,这里的叶子节点并不是真的叶子节点,而是NIL节点,即空节点。如图(a):

NIL节点有什么作用?如图(a-2),有多少条路径:

正确答案是有7条。路径路径的判断规则是:从根节点到NULL。

如果我们把NIL节点标记出来就好找路径了:

再比如,图(a-3)是否是红黑树:

大致一看好像是,但是把NIL节点标出来之后:

 路径(b)只有两个黑色节点,不满足红黑树的性质,不是红黑树。

红黑树的最短最长路径

那么红黑树的最短路径是什么样子的,应该是全黑的最短:

 那最长的路径呢,应该是一黑一红间隔排列的最长:

根据图(a-1)我们可以看出,最长的路径是最短的路径的2倍。

ps

一个红黑树不一定有最长路径,也不一定有最短路径。

如图(a-2),有最短路径,没有最长路径:

红黑树的路径范围

而知道了最短路径,最长路径,剩下的路径都在最短路径,最长路径范围内,可以写为

                             [n,2*n]

code

结构

template<class K,class V>struct	RBTreeNode
{RBTreeNode<K,V>* _left;RBTreeNode<K, V>* _right;RBTreeNode<K, V>* parent;pair<K, V>;Color _col;//初始话列表RBTreeNode(const pair<K, V>kv):_left(nullptr),_right(nullptr), _parent(nullptr), pair<K, V>,_col(RED){}
};

搞颜色

enum Color
{RED,BALACK
};

template<class  K,class V>class RBTree{typedef RBTreenode<k,v> Node;public:private:Node* _root = nullptr;};

插入

插入逻辑

如果节点为空,就给黑色。如果节点不为空,就插入值。

这个值如果比根节点小,就往左边插入,否则就往右边插入。

bool Insert(const pair<K, v>& kv){if (_root == nullptr){_root = new(kv);_root->_col = BALACK;return true;}//初始化父亲节点和根节点Node* parent = nullptr;Node* cur = _root;while (cur){//key值大,往右走if (cur->kv.first < kv.first){cur = cur->right;}//key值小,往左走else if (cur->kv.first > kv.first){cur = -cur->left;}//否则key值和当前节点相等,不插入else{return false;}}//找到了返回true1return true;	 }

新插入节点

思考:2. 检测新节点插入后,红黑树的性质是否造到破坏?

如图(b-1),现在要插入一个节点,那么是插入一个黑色节点还是红色节点呢?

如果插入黑色节点,那么该路径就会多一个黑色节点,根据红黑树特性,其他路径都要补一棵黑色节点,

如果插入红色节点,则只会影响父节点

(即

1.如果父节点也会红节点。两个红节点不能紧挨,需调整

2.如果父亲节点是黑色,则不需调整,直接插入。)。

我们看一下怎么调整,如图(b-2),新插入了一个红色节点7:

解决方法

能变色先变色,变色完之后还不行再旋转

变色

如图(b-3),先把父节点8变黑:

这个时候该路径就多了一个黑色节点,再变图(b-4)把6节点变红:

这个时候该路径又少了个黑色节点,再变图(b-5) 把5节点变黑:

旋转+变色

第二种情况,例如图(b-6):如果还是把父节点变为黑色,把6节点变为红色,那么其他路径就会多一个黑色节点。

而该路径又没有其他节点可以再变黑色来平衡这种状态,所以靠变色解决不了这个问题。

这个时候就要旋转了。

先右旋为图(c-1):

再左旋为图(c-2):

然后再变色为图(c-4):

第三种情况,如果根节点上面还有节点

如图(d-0),新插入了一个节点cur:

cur为红色节点,那就需要调整。

把p节点变为黑色节点,那么为了u节点也要变为黑色节点,那么此时就要把g节点变为红色节点。也就是图(d-1)

为什么要把g节点变为红色节点呢?

假设g节点不变为红色也就是图(d-3):

由图(d-1)变为图(d-3)我们发现每条路径凭空多了1个黑色节点。

g节点上面还有节点,那么多了个黑色节点,就会影响上面的路径,所以需要把g节点变红来平衡一下。

如图(d-1):

这个时候万一g节点的父节点是红色节点,如图(d-4):
两个红色节点不能连续,还要调整,如果g节点的父亲节点为黑色,如图(d-5),那就不需要再调整:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter笔记:光影动画按钮、滚动图标卡片组等

Flutter笔记 scale_design更新&#xff1a;光影动画按钮、滚动图标卡片组 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263…

HBuilderX 运行Android App项目至雷电模拟器

一、下载安装HBuilderX HBuildeX官网 安装最新的正式版&#xff0c;或者点击历史版本查看更多版本&#xff1b;【ps&#xff1a;Alpha版本为开发版&#xff0c;功能更多&#xff0c;但是也不稳定&#xff0c;属于测试版本】 直接将压缩包解压&#xff0c;运行HBuildeX即可。 二…

数据结构从未如此简单——图(一)

文章目录 前言图的初印象教科书力扣工作中的实际应用我们的学习方法 前言 个人感觉数据结构学习最大的难点就是抽象。这些概念和算法都是从许多源问题中抽离、精炼、总结出来的。我们学习的看似是最精华的部分&#xff0c;但是忽略了推导过程&#xff0c;很容易变成死记硬背&a…

Java学习 10.Java-数组习题

一、创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100 代码实现 public static void main(String[] args) {int[] arrnew int[100];for (int i 0; i < arr.length; i) {arr[i]i1;}System.out.println(Arrays.toString(arr));} 运行结果 二、改变…

react类式组件的生命周期和useEffect实现函数组件生命周期

概念 生命周期是一个组件丛创建,渲染,更新,卸载的过程,无论是vue还是react都具有这个设计概念,也是开发者必须熟练运用的,特别是业务开发,不同的生命周期做不同的事是很重要的. ....多说两句心得,本人是先接触vue的,无论是vue2还是vue3的生命周期,在理解和学习上都会比react更…

Spring IoC注解式开发

2023.11.11 注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 负责声明Bean的注解&#xff0c;常见的包括四个&#xff1a; ComponentControllerServiceRepository 通过源码可以发现&#xff0c;Controller、Service、Repository这三个注解都是Component注解的别名…

【pytorch深度学习】使用张量表征真实数据

使用张量表征真实数据 本文为书pytorch深度学习实战的一些学习笔记和扩展知识&#xff0c;涉及到的csv文件等在这里不会给出&#xff0c;但是我会尽量脱离这一些文件将书本想要表达的内容给展示出来。 文章目录 使用张量表征真实数据1. 加载图像文件2. 改变布局3. 加载目录下…

【Gradle-12】分析so文件和依赖的关系

1、前言 在包大小的占比中&#xff0c;so文件的占比往往是最高的&#xff0c;动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下&#xff0c;你更需要知道哪些依赖是没有适配v7a/v8a的&#xff0c;这将影响你的APP在应用市场…

Vue3 + Naive-ui Data Table 分页页码显示不全

当使用naive-ui 表格并且使用分页组件的时候 需要增加 remote

C++使用线程池模拟异步事件处理机制

在C很多框架中都有异步事件处理机制&#xff0c;这导致我们在看源码时经常很疑惑&#xff0c;难以理解&#xff0c;而其中包含的编程套路可能是一些成熟的技术&#xff0c;只是我们不熟悉&#xff0c;比如WebRTC中类似于Qt的信号槽机制&#xff0c;线程事件处理, 或者使用系统异…

Sensor 点亮出图后,颜色偏红或者偏绿是为什么?

这是因为 sensor balck level 的值配置的不正确导致&#xff0c;black level 的值一般在效果参数的 calibration 参数里面。 在驱动调试阶段&#xff0c;我们一般都是复用其他已调试好的&#xff0c;sensor 的驱动文件及效果文件&#xff0c; 而不同 sensor 的 balck level 的…

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…

网页推理游戏

目录 python challenge &#xff08;0&#xff09; &#xff08;1&#xff09; &#xff08;2&#xff09; The Riddle &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; Nazo &#xff08;1&#xff09;…

【Spring】SpringBoot日志

SpringBoot日志 日志概述日志使用打印日志获取日志对象使用日志对象打印日志日志框架介绍门面模式SLF4J框架介绍(simple logging facade for java) 日志格式说明日志级别日志级别的分类日志级别的使用 日志配置配置日志级别日志持久化配置日志文件的路径和文件名配置日志文件的…

【tgcalls】Instance接口的实例类的创建

tg 里有多个版本,因此设计了版本管理的map,每次可以选择一个版本进行实例创建这样,每个客户端就可以定制开发了。tg使用了c++20创建是要传递一个描述者,里面是上下文信息 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\Instance.cpp可以看到竟然是…

【数据结构】顺序表 | 详细讲解

在计算机中主要有两种基本的存储结构用于存放线性表&#xff1a;顺序存储结构和链式存储结构。本篇文章介绍采用顺序存储的结构实现线性表的存储。 顺序存储定义 线性表的顺序存储结构&#xff0c;指的是一段地址连续的存储单元依次存储链性表的数据元素。 线性表的&#xf…

单词规律问题

给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba”, s “dog cat cat d…

【Git】Git分支与标签掌握这些技巧让你成为合格的码农

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Git》。&#x1f3af;&#x1f3af; &#x1f449…

vue Sts认证后直传图片到阿里云OSS

后端进行sts认证生成临时身份凭证&#xff0c;前端通过凭证直传图片等文件到OSS中 一 OSS配置 增加用户和角色&#xff0c;创建OSS bucket 1.1 添加用户 登录阿里云管理控制台&#xff0c;右侧头像&#xff0c;进入访问控制 点击左侧导航栏的身份管理的用户&#xff0c;点击…

MySQL的索引和复合索引

由于MySQL自动将主键加入到二级索引&#xff08;自行建立的index&#xff09;里&#xff0c;所以当select的是主键或二级索引就会很快&#xff0c;select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整&#xff0c;那我这个索引只起了前一半作用。 所以用复合索引&am…