当前位置: 首页 > news >正文

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

目录

数据结构图-树

简介

规则

旋转

重新着色

红黑树构建过程


前言-与正文无关

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

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

数据结构图-树

简介

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

相关文章:

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

目录 数据结构图-树 简介 规则 旋转 重新着色 红黑树构建过程 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xf…...

React18-完成弹窗封装

弹框封装 用法 // 创建 userRef.current?.open(create) // 修改 userRef.current?.open(edit,values){/* 创建用户 */} <CreateUser mRef{userRef} update{} />组件暴露open方法 文档地址&#xff1a;https://react.dev/reference/react/useImperativeHandle useIm…...

蓝桥杯2024/1/31-----底层测试模板

和之前一样建好工程文件夹&#xff0c;里边包含User&#xff08;放工程文件&#xff0c;mian.c&#xff09;、Driver&#xff08;存放底层文件如Led.c&#xff0c;Led.h等&#xff09; 新建的工程先搭建框架&#xff0c;可以先书写底层函数&#xff08;此次书写了四个函数并包含…...

蓝桥杯备战(AcWing算法基础课)-高精度-乘-低精度

目录 前言 1 题目描述 2 分析 2.1 关键代码 2.2 关键代码分析 3 代码 前言 详细的代码里面有自己的理解注释 1 题目描述 给定两个非负整数&#xff08;不含前导 00&#xff09; A 和 B&#xff0c;请你计算 AB 的值。 输入格式 共两行&#xff0c;第一行包含整数 A&a…...

C++设计模式-里氏替换原则

里氏替换原则定义了继承规范。&#xff08;封装、继承、多态&#xff09; 定义1&#xff1a;类型S对象o1&#xff0c;类型T对象o2&#xff0c;o1换成o2时程序意图不变&#xff0c;那么S是T的子类。 定义2&#xff1a;使用子类不破坏父类的意图。 注意&#xff1a;如果子类不…...

compose LazyColumn + items没有自动刷新问题

val dataLists by remember { mutableStateOf(datas) } 数据更改后列表不刷新问题。 val dataLists by remember { mutableStateOf(datas) } LazyColumn(modifier Modifier.padding(top 5.dp)) {items(dataLists) {....}} 可以将mutableStateOf 改为mutableStateListOf解决…...

Java八大常用排序算法

1冒泡排序 对于冒泡排序相信我们都比较熟悉了&#xff0c;其核心思想就是相邻元素两两比较&#xff0c;把较大的元素放到后面&#xff0c;在一轮比较完成之后&#xff0c;最大的元素就位于最后一个位置了&#xff0c;就好像是气泡&#xff0c;慢慢的浮出了水面一样 Jave 实现 …...

编程笔记 html5cssjs 075 Javascript 常量和变量

编程笔记 html5&css&js 075 Javascript 常量和变量 一、JavaScript 变量二、JavaScript 常量三、示例&#xff1a;小结&#xff1a; 在JavaScript中&#xff0c;变量和常量是用来存储数据的占位符。它们的主要区别在于可变性&#xff1a;变量的值可以改变&#xff0c;而…...

题目 1159: 偶数求和

题目描述: 有一个长度为n(n<100)的数列&#xff0c;该数列定义为从2开始的递增有序偶数&#xff08;公差为2的等差数列&#xff09;&#xff0c;现在要求你按照顺序每m个数求出一个平均值&#xff0c;如果最后不足m个&#xff0c;则以实际数量求平均值。编程输出该平均值序…...

呼吸灯--FPGA

目录 1.breath_led.v 2.tb_breath_led.v 呼吸灯就是从完全熄灭到完全点亮&#xff0c;再从完全点亮到完全熄灭。具体就是通过控制PWM的占空比控制亮灭程度。 绘制PWM波的步骤就是&#xff0c;首先灯是在第一个时钟周期保持高电平熄灭状态&#xff0c;在第二个时钟周期保持1/1…...

MySQL数据库①_MySQL入门(概念+使用)

目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库&#xff0c;服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…...

虚幻UE 特效-Niagara特效实战-魔法阵

回顾Niagara特效基础知识&#xff1a;虚幻UE 特效-Niagara特效初识 其他四篇实战&#xff1a;UE 特效-Niagara特效实战-烟雾、喷泉、 虚幻UE 特效-Niagara特效实战-火焰、烛火、 虚幻UE 特效-Niagara特效实战-雨天、 虚幻UE 特效-Niagara特效实战-眩晕。 本篇笔记记录了使用空模…...

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制&#xff0c;其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中&#xff0c;然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…...

Latex学习记录

目录 1.Latex各种箭头符号总结 2.[Latex]公式编辑&#xff0c;编号、对齐 3.Latex公式编号: 多行公式多编号&#xff0c;多行公式单编号 4.LaTex中输入空格以及换行 1.Latex各种箭头符号总结 箭头符号 - ➚ (piliapp.com)https://cn.piliapp.com/symbol/arrow/Latex各种箭头…...

你在做绩效考核,还是绩效管理?二者有什么区别

绩效考核&#xff0c;为什么99%都失败&#xff0c;最后一地鸡毛&#xff1f;败在指标&#xff01; 绩效管理&#xff0c;为什么大多数企业都能成功&#xff0c;而且越做越好&#xff1f;成在目标&#xff01; 丢掉层层指标&#xff0c;人人制定目标&#xff0c;这是企业重新定…...

ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发

需求分析 展示切换动画搜索框输入文字&#xff0c;自动发送请求搜索结果展示搜索状态维护历史搜索展示&#xff0c;点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…...

C系列-柔性数组

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 ​编辑 柔性数组 柔性数组的特点 柔性数组的使用 柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组这个概念&#xff0c;但是它确实是存在的&#xff0c;C99中&#…...

【Linux网络编程一】网络基础1(网络框架)

【Linux网络编程一】网络基础1&#xff08;网络框架&#xff09; 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点&#xff1a;网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…...

springboot156基于SpringBoot+Vue的常规应急物资管理系统

基于SpringBootVue的常规应急物资管理系统的设计与实现 摘 要 1 ABSTRACT 2 第一章 绪论 3 1.1研究背景 3 1.2研究意义 3 1.3国内外研究现状 4 1.3.1国外研究现状 4 1.3.2国内研究现状 4 1.4研究内容与方法 5 1.4.1研究内容 5 1.4.2研究方法 5 1.5论文的组织结构 5…...

学习MySQL的MyISAM存储引擎

学习MySQL的MyISAM存储引擎 MySQL的MyISAM存储引擎是MySQL早期版本中默认的存储引擎&#xff0c;后来被InnoDB所取代。尽管InnoDB在许多方面提供了更高级的特性&#xff0c;如事务处理、行级锁定和外键支持&#xff0c;MyISAM仍然因其简单性、高性能以及对全文搜索的支持而被广…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...