数据结构——红黑树基础(博文笔记)

news2024/9/27 17:29:51

数据结构在查找这一章里介绍过这些数据结构:BST,AVL,RBT,B和B+。

除去RBT,其他的数据结构之前的学过,都是在BST的基础上进行微小的限制。

1.比如AVL是要求任意节点的左右子树深度之差绝对值不大于1,由此引出插入删除等操作时的LL,RR,RL,LR旋转。
2.B树要求二叉树节点中保存的数据只有一个,而B-树得节点中保存的是线性表,真实数据数据不止一个有很多。由于表中的指针和子节点一一对应,而子节点个数又有限定(小于m但大于m/2)
3.B+树则是修改了B数里的规则,要求每个节点的关键字要出现在其对应子节点中。

废话少说,开始整理RBT,下面整理的内容是参考这篇文章的,很推荐去读一下。

1.RBT的基本定义

0.满足BST的要求

1.根节点和叶子节点是黑色的(叶子节点是空节点,下图中将null节点省略)

2.对于任意节点,从此节点到任何叶子节点的简单路径上的黑色节点数量一致。

3.只有红色和黑色两种颜色的节点

4.任意红色节点不相邻

顶端为黑,非红即黑,红不相邻,叶路黑同
在这里插入图片描述

2.RBT的插入

我们插入的节点一定为红色节点

情况1:插入为节点为a,其叔叔节点d为红色

在这里插入图片描述
(这里注意,我们如果发现c其实是根节点的话,直接将b和d变成黑色)

改变之后还需要注意c父节点是否为红色,如果是则需要继续向上调整。

情况2:如果插入节点a是右孩子,它的叔叔节点 d 是黑色。

在这里插入图片描述
此时我们需要对a做一步左旋,然后进入情况三

情况3:插入点a为左子,叔叔节点为黑

在这里插入图片描述
这样则是以b做右旋,然后交换b和c的颜色。

几个小技巧:
1.如何判断旋转类型:
我们从根节点向引发“事故”的节点走,连续两步就可以确定是LL,RR,LR,RL
2.怎么转。
LL是以不平衡子树的根节点,向右旋一次,RR则是向左旋。
LR是先以引发节点左旋一次,然后以根节点右旋一次,RL同理。

3.RBT的删除

为了保证满足红黑树定义的要求,有些节点会被标记成两种颜色,“红 - 黑”或者“黑 - 黑”。如果一个节点被标记为了“黑 - 黑”,那在计算黑色节点个数的时候,要算成两个黑色节点。

删除操作的平衡调整分为两步:

1.第一步是针对删除节点初步调整。初步调整只是保证整棵红黑树在一个节点删除之后,仍然满足最后一条定义的要求,也就是说,每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;

2.第二步是针对关注节点进行二次调整,让它满足红黑树的第三条定义,即不存在相邻的两个红色节点。

初步调整

情况1:删除节点a,仅有一个子节点b

在这里插入图片描述
删除节点 a,并且把节点 b 替换到节点 a 的位置,改变b的颜色。

情况2:删除的节点 a 有两个非空子节点,并且它的后继节点就是节点 a 的右子节点 c

在这里插入图片描述
如果C无左子树,则删除a用c替代,c设置为与a相同的颜色,如果c原本为黑色,那么给c的子节点d多加一个黑色,变为“红 - 黑”或者“黑 - 黑”,这个时候,关注节点变成了节点 d,第二步的调整操作就会针对关注节点来做。

情况3:删除的是节点 a,它有两个非空子节点,并且节点 a 的后继节点不是右子节点

在这里插入图片描述

如果c有左子树,那么就让下一层的节点胜任后继节点,如果节点 d 是黑色,则c多加一个黑色标记。

二次调整

初步调整之后,关注节点变成了“红 - 黑”或者“黑 - 黑”节点。针对这个关注节点,再分四种情况来进行二次调整。

备注:二次调整是为了让红黑树中不存在相邻的红色节点。

情况1:如果带标记点是 a,它的兄弟节点 c 是红色的

在这里插入图片描述
b左旋,然后标记节点和祖父节点c与父节点b交换颜色

情况2:如果带标记点是 a,它的兄弟节点 c 是黑色的,并且节点 c 的左右子节点 d、e 都是黑色的

在这里插入图片描述
标记节点的兄弟c改为红色,a取消标记,父节点带标记。

前两种情况调整完后仍需找机会调整至第三种情况,然后转跳至第四种情况完成调整。

情况3:如果带标记点是 a,它的兄弟节点 c 是黑色,c 的左子节点 d 是红色,c 的右子节点 e 是黑色

在这里插入图片描述
点 a 的兄弟节点 c 右旋;节点 c 和节点 d 交换颜色;转为第四种情况

情况4:如果带标记点 a 的兄弟节点 c 是黑色的,并且 c 的右子节点是红色的

在这里插入图片描述
带标记节点a的父点 b 左旋;
将点 c 的颜色与点 b 设置成相同的颜色;
点 b 的颜色设置为黑色;
点 a 中去掉一个黑色,节点 a 就变成了红色或者黑色;
点 a 的叔叔节点 e 设置为黑色;
调整结束

我的妈啊,删除的第二步调整太复杂了!

写在后面的一点碎碎念

预推免面试时间紧迫,本想着两天吃透数据结构,结果发现自己有些痴心妄想了,两天复习下来发现了很多问题。
1.经常考察的十个排序里有很多忘记了具体实现。
2.查找这一章,我发现自己对B+,RBT基本不了解
3.图论这一章,我把AOE忘了
4.串串这一章的KMP虽然好学,但是这东西学一次忘一次。
5.绪论里很多基本概念不清楚,比如逻辑结构中线性结构的三个类型的典型代表的具体原理和实现

然后计划如下:
1.如此看来完全搞好数据结构可能还需要3天左右,这3天里我会搞完数据结构,把之前复习好的操作系统和计算机网络巩固好不能忘记(短期计划)
2.然后是深度学习项目的很多理论知识忘了,我会坚持每天去学习机器学习基础和之前项目中的深度学习知识,对于机器学习基础,Fastrcnn,yolo,transformer和deepsort做到原理熟悉。(长期计划)
3.每天抽出时间去了解老师,套磁老师,准备面试需要的英语自我介绍和基本问题问答。(长期计划)

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

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

相关文章

【Java可执行命令】(十四)脚本执行工具jrunscript :在命令行环境下交互式执行一些简单的脚本或测试代码片段~

Java可执行命令之jrunscript 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 启动 jrunscript 直接执行脚本3.3 可选参数&#xff1a;-l < language>3.4 可选参数&#xff1a;-e < script>3.5 可选参数&#xff1a;-f < script file>3.6 注意事项 4️…

powershell脚本写一个托盘图标

1、准备ico格式图标 star_bethlehem_icon 文件名改为star.ico 2、安装VSCode 如何下载安装VSCode 扩展&#xff1a;PowerShell扩展 3、创建项目 1、运行PowerShell命令 mkdir trayicon_ps1;cd trayicon_ps1;New-Item trayicon.ps1;code .2、将star.ico放入trayicon_ps1文…

stable diffusion(1): webui的本地部署(windows)

一、前言 是的&#xff0c;现在是202308月份了&#xff0c;网上已经有很多打包好的工具&#xff0c;或者直接进一个web就能用SD的功能&#xff0c;但是我们作为程序员&#xff0c;就应该去躺坑&#xff0c;这样做也是为了能够有更多自主操作的空间。 像其他AI一样&#xff0c…

【MySQL】锁(十三)

🚗MySQL学习第十三站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 锁是计算机协调多个进程或线程并发访问某一共享资源的机制。在数据库中,除传统的计算资源(CPU、 RAM、I/O)的争用以外,数据也是一种供许多用户共享的资…

监控数据的采集方式及原理

1、读取 /proc 目录 /proc 是一个位于内存中的伪文件系统&#xff0c;该目录下保存的不是真正的文件和目录&#xff0c;而是一些“运行时”信息&#xff0c;Linux 操作系统层面的很多监控数据&#xff0c;比如内存数据、网卡流量、机器负载等&#xff0c;都是从 /proc 中获取的…

Mac系统如何修改默认的Java版本

1. 确定Java版本 # 查看当前系统都有哪些Java版本 /usr/libexec/java_home -V | grep jdk# 运行以下命令来查看当前默认的 Java 版本 java -version# 运行以下命令来查找当前默认的 Java 安装路径 /usr/libexec/java_home/usr/libexec/java_home -V | grep jdk java -versio…

【Cadence】stb仿真和ac仿真——以一个简单的全差分反相放大器仿真为例

最近在补一些仿真方法学的问题&#xff0c;以及一些一直以来都有点模糊的概念&#xff0c;简单记录一下。 具体问题包括&#xff1a; ac仿真和stb仿真的原理、区别&#xff0c;仿真得到的幅频响应是否一致&#xff0c;开关电容放大器只能使用stb仿真吗&#xff1b;放大器稳定性…

AR远程专家指导在汽车改装上的应用有哪些?

随着科技的不断发展&#xff0c;AR增强现实技术逐渐走进了我们的生活。加上商贸国际化&#xff0c;远程协同纵深到制造生产的更多环节&#xff0c;研发协同、工艺优化等场景复杂、跨层级、需要频繁沟通确认的流程正通过AR应用实现全面远程化的过渡&#xff0c;在汽车行业&#…

C# 回文链表

234 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&…

刷题笔记 day6

力扣 57 和为s的两个整数 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;int i 0 , j nums.size()-1;while(i < j){if(nums[i] nums[j] > target){--j;}else if(nums[i] nums[j] < target){i…

MMDeploy安装、python API测试及C++推理

服务器配置如下&#xff1a; Cuda版本&#xff1a;11.1 Cudnn版本&#xff1a;8.2.0 显卡版本&#xff1a;RTX3090 使用转换脚本将.pth模型转换为ONNX格式 python mmdeploy/tools/deploy.py \mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py \mmdetect…

解决Win11右键菜单问题

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 程序日常 ✨特色专栏&…

【企业方案】如何在海量数据中找到热点Key(附JdHotKey解决方案)

文章目录 1. 概述2. 热点Key问题分析3. 解决方案3.2 滑动窗口3.2 京东毫秒级热Key探测框架3.2.1 JdHotKey使用教程3.2.2 JdHotKey常用API 1. 概述 如何在海量数据找到热点Key&#xff1f;&#xff1f;&#xff1f;这时候难免有人回答“这不简单&#xff0c;在同一秒内访问达到…

使用IDEA操作Mysql数据库

idea中自带了关于数据库的连接 首先要确保你的MySQL正在运行中 打开idea找到database&#xff08; view —> Tool Windows —> database&#xff09;&#xff0c;大家也可以定个快捷键&#xff0c;方便以后日常操作 就是这个样子&#xff0c;然后点加号 然后就可以编写执…

Mac提示文件:已损坏,无法打开。你应该把它移到废纸篓

文章目录 一、电脑信息二、打开任何来源设置三、更改应用程序拓展属性 一、电脑信息 我的是新版的Venture 13的系统。UI改的比较多。与之前的配置还是有很大的区别的。 打开下载的软件&#xff0c;显示已经损坏&#xff0c;打不开。抛开软件本身的问题外&#xff0c;一般是Ma…

【C语言学习】C语言的基础数据类型

一、数据类型 1.整型 short(短整型) int&#xff08;整型 long&#xff08;长整型&#xff09; long long&#xff08;长整型&#xff09;2.浮点型 float&#xff08;单精度型&#xff09; double&#xff08;双精度型&#xff09; long double3.字符类型 char…

【MMCV】mmpretrain/mmclassification概览、环境安装与验证

概览 MMPretrain 是一个全新升级的预训练开源算法框架,旨在提供各种强大的预训练主干网络, 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup,并开发了许多令人兴奋的新功能。 目前,预训练阶段对于视觉识别至关重要,凭借丰富而强…

Android 性能调优之bitmap的优化

背景 Android开发中&#xff0c;加载图片过多、过大很容易引起OutOfMemoryError异常&#xff0c;即我们常见的内存溢出。因为Android对单个应用施加内存限制&#xff0c;默认分配的内存只有几M&#xff08;具体视不同系统而定&#xff09;。而载入的图片如果是JPG之类的压缩格…

Java POI 百万规模数据的导入和导出

目录 1、百万数据导入1.1 需求分析1.2 思路分析1.3 代码实现1.3.1 步骤分析1.3.2 自定义处理器1.3.3 自定义解析1.3.4 测试 2、百万数据导出2.1、概述2.2、解决方案分析2.3、原理分析2.4、百万数据的导出2.4.1、模拟数据2.4.2、思路分析2.4.3、代码实现2.4.4、测试结果 1、百万…

面试题:请说下什么是重绘和重排(回流)?他们的区别是什么?

答&#xff1a; ● 第一次渲染 ○ html结构 解析为 dom树 ○ css样式 解析为 样式规则 ○ dom树 和 样式规则 匹配下&#xff0c;生成渲染树&#xff01; ○ 接下来就是重排&#xff1a;根据渲染树&#xff0c;得到每个盒子的几何信息&#xff08;大小位置&#xff09; ○ 最后…