Java 数据结构 二叉树(二)红黑树

news2024/11/16 21:28:20

目录

数据结构图-树

简介

规则

旋转

重新着色

红黑树构建过程


前言-与正文无关

        生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步,欣赏生活中的每一道风景,享受与家人朋友的温馨时光,发现那些平凡日子里隐藏的幸福时刻。因为,这些点点滴滴汇聚起来的,才是构成我们丰富多彩生活的本质。希望每个人都能在繁忙的生活中找到自己的快乐之源,不仅仅为了生存而工作,更为了更好的生活而生活。

        送你张美图!希望你开心!

数据结构图-树

简介

红黑树是一种自平衡的二叉搜索树。在二叉搜索树中,树中的每个节点都有一个键值,且每个节点的键值都大于其左子树中任何节点的键值,并小于其右子树中任何节点的键值。红黑树增加了一些额外的属性来确保树保持平衡,这样任何时间的查找、插入和删除操作的最坏情况时间复杂度都保持在 O(log n)。

规则

红黑树必须遵循以下属性:

  1. 节点颜色: 每个节点要么是黑色,要么是红色。
  2. 根节点: 树的根节点是黑色的。最底层每个叶子节点(NIL节点,空节点)是黑色的。
  3. 红色节点规则: 如果一个节点是红色的,则其子节点必须是黑色的(即不允许连续的红色节点)。
  4. 黑色高度: 从任一节点到其任何叶子节点的所有路径上的黑色节点数量相同(平衡的关键) 
  5. 新插入的节点为红色: 新插入节点默认为红色,插入后需要校验红黑树是否符合规则,不符合则需要进行平衡

为了维持这些属性,红黑树在插入新节点或删除节点后会通过旋转和重新着色来进行调整。

旋转

旋转: 当插入或删除节点导致红黑树的性质被破坏时,可以通过旋转来重新平衡树。旋转有两种:

  • 左旋: 节点的右子节点上升到其位置,而原节点变成了这个右子节点的左子节点。

左旋操作将节点 Y旋转到节点 X 的位置,而节点 X 成为了 Y的左子节点。重要的是要注意,a节点比X小,成为x左节点,c同理还是在Y右边因为比Y大。b因为他是比Y小,按照规则他应该是在半边,又因为他比x大,所以在x右下面,这样左旋操作不会违反二叉搜索树的性质。

  • 右旋: 节点的左子节点上升到其位置,而原节点变成了这个左子节点的右子节点。

右旋我就不细说了,和左旋类似,看左旋你应该就明白了

重新着色

如果节点的颜色导致红黑树性质被破坏(特别是连续红色节点的问题),则可以通过改变某些节点的颜色来修复。

就是当前节点与父节点、叔叔节点同为红色,这种情况违反了红黑树的规则3,需要将红色向祖辈上传, 父节点和叔叔节点红色变为黑色,爷爷节点从黑色变为红色(顶级爷爷节点必为黑色,这里是做演示,可以理解现在顶级祖宗还是黑的)。这样每条叶子结点到根节点的黑色节点数量并未发生变化。

红黑树构建过程

 

        新插入节点默认为红色,5<10 ,插入到左子节点,插入后左子树深度为 2 (叶子节点黑色【只是上图没画出来,根据规则2】 + 根节点 黑色),右子树深度为也是2 (叶子节点黑色 + 根节点黑色),满足红黑树规则。
        新插入节点为红色,9<10 ,需要在左子树进行插入,再和 5 比较,大于 5 ,放到 5 的右子树中,此时各个叶子节点到根节点的深度依然是2 ,但 5 9 两个节点都是红色,不满足规则第 4 条,需要进 行左旋、右旋操作,使其符合规则。可以看出经过操作后,左右子树又维持了平衡。
下面不想看,可以没必要看,其实还是上面那些再多讲些罢了

 

       插入节点3 后,可以看到又不符合红黑树的规则了,而此时的情况,需要采用颜色反转的操作,就 是把5 10 两个节点变为黑色, 5 10 的父节点变为红色,但父节点 9 是根节点,不能为红色,于是再将 9 变为黑色,这样整个树的深度其实增加了1 层。
        继续插入6 节点,对树深度没有影响。
        插入7 节点后, 6 7 节点都为红节点,不满足规则 4 ,需要进行颜色反转调整,也就是 7 的父节点和叔叔节点变为黑色,爷爷节点5 变为红色

        继续插入节点19 ,对树深度没有影响,红黑树的规则都满足,无需调整。
        插入节点32 后,又出现了不满足规则 4 的情况,此时节点 32 没有叔叔节点,如果颜色反转的话,左右子树的深度就出现不一致的情况,所以需要对爷爷节点进行左旋操作。
        父节点取代爷爷节点的位置,父节点变为黑色,爷爷节点变为父节点的左子树变为红色

 

 

        插入节点24 后,红黑树不满足规则 4 ,需要调整。
        此时父节点32 和叔叔节点 10 都为红色,需要进行颜色反转,爷爷节点 19 变为红色,父节点、叔叔 节点变为黑色,颜色反转树的深度不发生变化。

------------------------------------------与正文内容无关------------------------------------
 如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!

这是我全部文章所在目录,看看是否有你需要的,如果遇到觉得不对地方请留言,看到后我会查阅进行改正。

A乐神-CSDN博客

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

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

相关文章

关于华为应用市场上架,申请权限未告知目的被驳回问题的简单处理方式

关于华为应用市场上架过程中出现的【您的应用在运行时&#xff0c;未同步告知权限申请的使用目的&#xff0c;向用户索取&#xff08;存储、拍照&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。】 使用方式&#xff1a; 1、引入 import permision from "/m…

配置实例—交换机VLAN聚合配置实例

一、组网需求 某公司拥有多个部门且位于同一网段&#xff0c;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN中。现由于业务需要&#xff0c;不同部门间的用户需要互通。如图1所示&#xff0c;VLAN2和VLAN3为不同部门&#xff0c;现需要实现不同VLAN间的用户可…

【MySQL】学习如何通过DQL进行数据库数据的基本查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KvH5jXnPNsRtMkOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Java学习day28:线程池Pool(知识点非常非常的详解)

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾 Java学习day27&#xff1a;join方…

YOLOv5算法进阶改进(15)— 引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

c语言---操作符(详解)

目录 一、操作符的分类二、算术操作符三、 移位操作符3.1<<左移操作符3.1.1移位规则3.1.2直接上代码以及解释 3.2>> 右移操作符3.2.1移位规则3.2.2画图解释 3.3注意 四、位操作符&#xff1a;&、|、^、~4.1&按位与4.1.1按位与的计算逻辑4.1.2代码4.1.3运行…

Modbus协议学习第七篇之libmodbus库API介绍(modbus_write_bits等)

写在前面 在第六篇中我们介绍了基于libmodbus库的演示代码&#xff0c;那本篇博客就详细介绍一下第六篇的代码中使用的基于该库的API函数。另各位读者&#xff0c;Modbus相关知识受众较少&#xff0c;如果觉得我的专栏文章有帮助&#xff0c;请一定点个赞&#xff0c;在此跪谢&…

redis布隆过滤器(Bloom)详细使用教程

文章目录 布隆过滤器1. 原理2. 结构和操作3. 特点和应用场景4. 缺点和注意事项 应用-redis插件布隆过滤器使用详细过程安装以及配置springboot项目使用redis布隆过滤器下面是布隆过滤器的一些基础命令 扩展 布隆过滤器 Bloom 过滤器是一种概率型数据结构&#xff0c;用于快速判…

算法学习——华为机考题库5(HJ31 - HJ35)

算法学习——华为机考题库5&#xff08;HJ31 - HJ35&#xff09; HJ31 单词倒排 描述 对字符串中的所有单词进行倒排。 说明&#xff1a; 1、构成单词的字符只有26个大写或小写英文字母&#xff1b; 2、非构成单词的字符均视为单词间隔符&#xff1b; 3、要求倒排后的单…

Jmeter,如何从数组参数中取值

有个post请求&#xff0c;参数“equipment_ids”&#xff0c;是个数组&#xff0c;需求每次执行的时候&#xff0c;按顺序取equipment_ids中不同的值 要实现在 JMeter 中每次执行请求时按顺序取不同的 equipment_ids 中的值&#xff0c;你可以使用 Counter 元件来生成索引&…

Linux 磁盘空间占用率100%的排查

&#x1f4d1;前言 使用 Linux 操作系统时&#xff0c;可能会遇到磁盘空间不足的错误&#xff0c;这种错误通常会导致系统运行缓慢或崩溃。本文将介绍磁盘排查的方法。⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1…

【深入浅出Java性能调优】「底层技术原理体系」详细分析探索Java服务器性能监控Metrics框架的实现原理分析(Dropwizard度量基础案例指南)

深入探索Java服务器性能监控Metrics框架的实现原理分析 前提介绍Dropwizard MetricsDropwizard的特点Dropwizard的开发案例需要引入Maven依赖常用度量类型Meter(每秒请求数为单位测量请求率)定义度量核心MetricRegistry构建对应的Meter指标对象请求标记采样业务方法控制报告器…

【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

阅读导航 引言一、C语言的输入与输出二、流是什么三、CIO流1. C标准IO流&#xff08;1&#xff09;istream&#xff08;2&#xff09;ostream&#xff08;3&#xff09;iostream&#xff08;4&#xff09;cin 和 cout 2. C文件IO流&#xff08;1&#xff09;ifstream&#xff0…

WPF简介

WPF早期名称为Avalon&#xff0c;是微软的一个项目&#xff0c;目的是构建统一的平面展示平台 WPF是一个与分辨率无关的UI框架&#xff0c;是一种基于矢量的呈现引擎技术&#xff1b;所用的语言为XAML(全称Extensible Application MarkupLanguage)&#xff0c;它的基本度量单位…

02 使用jdk运行第一个java程序:HelloWorld

使用jdk运行第一个java程序 1 HelloWorld小案例1.1 编写流程1.2 错误示例 首先在CMD命令行里面&#xff0c;使用javac xxxx.java&#xff0c; 进行编译&#xff0c;其中会有报错&#xff1b; 然后生成xxxx.class 文件&#xff0c;然后使用java xxxx.class 进行运行。 1 HelloWo…

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

五大浏览器内核及代表浏览器,一文讲透!

Hi,我是贝格前端工场&#xff0c;在进行web前端开发的时候&#xff0c;浏览器兼容性一直是让所有前端工程师头疼的问题&#xff0c;其根源在于不同的浏览器应用了不同的内核&#xff0c;其对html、css、js的解析规则也是不一样的&#xff0c;作为前端开发的你&#xff0c;如果不…

2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模

上一篇已经对赛题进行详细分析了&#xff0c;而且大方向和基本的模型已经确定完毕&#xff0c;数据集都已经找到了&#xff0c;现在最重要的就是要分析风暴数据集以及建立时序预测模型&#xff0c;使用气候模型预测的数据&#xff0c;评估气候变化对未来极端天气事件频率和强度…

全面认识DOS系统

目录 一、DOS系统的功能 1.执行命令和程序&#xff08;处理器管理&#xff09; 2.内存管理 3.设备管理 4.文件管理 5.作业管理 二、文件与目录 三、文件类型与属性 1.系统属性&#xff08;S&#xff09; 2.隐含属性&#xff08;H&#xff09; 3.只读属性&#xff08…

深度学习手写字符识别:训练模型

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…