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

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

数据结构在查找这一章里介绍过这些数据结构: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.每天抽出时间去了解老师,套磁老师,准备面试需要的英语自我介绍和基本问题问答。(长期计划)

相关文章:

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

数据结构在查找这一章里介绍过这些数据结构:BST,AVL,RBT,B和B。 除去RBT,其他的数据结构之前的学过,都是在BST的基础上进行微小的限制。 1.比如AVL是要求任意节点的左右子树深度之差绝对值不大于1,由此引出…...

盘点帮助中心系统可以帮到我们什么呢?

在线帮助中心系统是一种强大的软件系统,可以让我们用来组织、管理、发布、更新和维护企业的宝贵知识库和用户文档。今天looklook就详细讲讲,除了大众所熟知的这些,帮助中心系统还有什么特别作用呢? 帮助中心系统的作用 1.快速自助…...

Web3 solidity编写交易所合约 编写ETH和自定义代币存入逻辑 并带着大家手动测试

上文 Web3 叙述交易所授权置换概念 编写transferFrom与approve函数我们写完一个简单授权交易所的逻辑 但是并没有测试 其实也不是我不想 主要是 交易所也没实例化 现在也测试不了 我们先运行 ganache 启动一个虚拟的区块链环境 先发布 在终端执行 truffle migrate如果你跟着我…...

概念解析 | 生成式与判别式模型在低级图像恢复与点云重建中的角力:一场较量与可能性探索

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:生成式模型与判别式模型在低级图像恢复/点云重建任务中的优劣与特性。 生成式与判别式模型在低级图像恢复与点云重建中的角力:一场较量与可能性探索 1. 背景介绍 机器学习…...

【云原生】kubectl命令的详解

目录 一、陈述式资源管理方式1.1基本查看命令查看版本信息查看资源对象简写查看集群信息配置kubectl自动补全node节点查看日志 1.3基本信息查看查看 master 节点状态查看命名空间查看default命名空间的所有资源创建命名空间app删除命名空间app在命名空间kube-public 创建副本控…...

uniapp两个单页面之间进行传参

1.单页面传参:A --> B url: .....?code JSON.stringify(param), 2.单页面传参B–>Auni.$emit() uni.$on()...

uniapp运行项目到iOS基座

2022年9月,因收到苹果公司警告,目前开发者已无法在iOS真机设备使用未签名的标准基座,所以现在要运行到 IOS ,也需要进行签名。 Windows系统,HBuilderX 3.6.20以下版本,无法像MacOSX那样对标准基座进行签名…...

HTTP——九、基于HTTP的功能追加协议

HTTP 一、基于HTTP的协议二、消除HTTP瓶颈的SPDY1、HTTP的瓶颈Ajax 的解决方法Comet 的解决方法SPDY的目标 2、SPDY的设计与功能3、SPDY消除 Web 瓶颈了吗 三、使用浏览器进行全双工通信的WebSocket1、WebSocket 的设计与功能2、WebSocket协议 四、期盼已久的 HTTP/2.01、HTTP/…...

Redis 在电商秒杀场景中的应用

Redis 在电商秒杀场景中的应用 一、简介1.1 简介1.2 场景应用 二、Redis 优势与挑战2.1 优势2.2 秒杀场景的挑战 三、应用场景分析3.1 库存预热代码示例 3.2 分布式锁3.3 消息队列 四、系统设计方案4.1 架构设计4.2 技术选型4.3 数据结构设计 五、Redis 性能优化5.1 集群部署5.…...

大麦订单生成器 大麦一键生成订单

后台一键生成链接,独立后台管理 教程:修改数据库config/Conn.php 不会可以看源码里有教程 下载源码程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3...

Java实现Google cloud storage 文件上传,Google oss

storage 控制台位置 创建一个bucket 点进bucket里面,权限配置里,公开访问,在互联网上公开,需要配置角色权限 新增一个访问权限 ,账号这里可以模糊搜索, 角色配置 给allUser配置俩角色就可以出现 在互联…...

适配器模式(AdapterPattern)

适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 优缺点 优点: 单一职责原则。你可以将接口或数据转换代码从程序主要业务逻辑中分…...

Apache Kafka Learning

目录 一、Kafka 1、Message Queue是什么? 2、Kafka 基础架构 3、Kafka安装 4、Offset自动控制 5、Acks & Retries 6、幂等性 7、事务控制 8、数据同步机制 9、Kafka-Eagle 二、Maven项目测试 1、Topic API 2、生产者&消费者 一、Kafka Kafka是…...

手把手教你用idea实现Java连接MySQL数据库

目录 1.下载MySQL 2.下载mysql 的jdbc驱动 3.将驱动jar包导入idea 4.通过Java测试数据库是否连接成功 1.下载MySQL 首先如果没有mysql的需要先下载MySQL,可以看这个教程 MYSQL安装手把手(亲测好用)_程序小象的博客-CSDN博客 2.下载mysql…...

Ubuntu 22.04安装和使用ROS1可行吗

可行。 测试结果 ROS1可以一直使用下去的,这一点不用担心。Ubuntu会一直维护的。 简要介绍 Debian发行版^_^ AI:在Ubuntu 22.04上安装ROS1是可行的,但需要注意ROS1对Ubuntu的支持只到20.04。因此,如果要在22.04上安装ROS1&am…...

83 | Python可视化篇 —— Bokeh数据可视化

Bokeh 是一种交互式数据可视化库,它可以在 Python 中使用。它的设计目标是提供一个简单、灵活和强大的方式来创建现代数据可视化,同时保持良好的性能。Bokeh 支持多种图表类型,包括线图、散点图、柱状图、饼图、区域图、热力图等。此外,它还支持将这些图表组合在一起以创建…...

图像 检测 - RetinaNet: Focal Loss for Dense Object Detection (arXiv 2018)

图像 检测 - RetinaNet: Focal Loss for Dense Object Detection - 密集目标检测中的焦点损失(arXiv 2018) 摘要1. 引言2. 相关工作References 声明:此翻译仅为个人学习记录 文章信息 标题:RetinaNet: Focal Loss for Dense Obje…...

MySQL 与MongoDB区别

一、什么是MongoDB呢 ? MongoDB 是由C语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一…...

Kaggle First Place Winner Solution Study——多变量回归问题

本期分享一个Kaggle上playground系列多变量回归问题的第一名解决方案。试着分析、复现、学习一下金牌选手的数据分析思路。 赛题链接: Prediction of Wild Blueberry Yield | Kagglehttps://www.kaggle.com/competitions/playground-series-s3e14第一名解决方案链…...

分布式应用:Zookeeper 集群与kafka 集群部署

目录 一、理论 1.Zookeeper 2.部署 Zookeeper 集群 3.消息队列 4.Kafka 5.部署 kafka 集群 6.FilebeatKafkaELK 二、实验 1.Zookeeper 集群部署 2.kafka集群部署 3.FilebeatKafkaELK 三、问题 1.解压文件异常 2.kafka集群建立失败 3.启动 filebeat报错 4.VIM报错…...

Unity安卓打包实战指南:从环境配置到APK生成全链路排错

1. 这不是“入门教程”,而是一份写给真实开发现场的生存指南你打开Unity,新建一个3D项目,拖进一个Cube,点击Play——它动了。你松了口气,觉得“Unity好像也没那么难”。但当你把APK打包发给测试同事,对方回…...

LVGL多页面开发避坑:用内部Timer替代轮询,解决页面切换时的内存踩踏问题

LVGL多页面开发中的内存安全实践:用Timer机制替代轮询的工程解决方案 在嵌入式UI开发中,LVGL因其轻量级和跨平台特性成为热门选择。但当项目复杂度提升到多页面交互时,开发者往往会遇到一个棘手问题:如何在频繁切换页面的同时保证…...

基于MAX78000与CNN的智能螺栓巡检小车:嵌入式AI实战解析

1. 项目概述与核心思路在轨道交通的日常运维中,螺栓的紧固状态检查是一项繁重且关键的任务。无论是轨道上的紧固螺栓,还是列车转向架、轮对轴承上的关键螺栓,其松动或失效都可能引发严重的安全事故。传统的人工巡检方式不仅效率低下&#xff…...

DeepSeek-R1代码补全实测报告:37个真实项目、8类编程语言、48小时压测后,我删掉了Copilot

更多请点击: https://intelliparadigm.com 第一章:DeepSeek-R1代码补全实测报告总览 DeepSeek-R1 是深度求索(DeepSeek)推出的开源大语言模型,专为代码理解与生成任务优化。本章聚焦其在主流 IDE 环境中代码补全能力的…...

如何永久保存微信聊天记录?WeChatMsg终极数据导出指南

如何永久保存微信聊天记录?WeChatMsg终极数据导出指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

关于我第九次博客作业

(1)Flex布局核心概念一、Flex 是什么Flex 是 CSS3 一维弹性布局,专治元素对齐、自适应、空间分配问题,布局更高效灵活。二、两大核心角色1. 父容器(Flex容器)设置 display: flex 即为弹性父盒子,负责统一规定子元素排列…...

BurpSuite+SqlMap深度集成:构建高可信SQL注入检测流水线

1. 这不是“点几下就出结果”的玩具,而是你真正能放进渗透流程里的SQL注入检测流水线很多人第一次看到“BurpSuiteSqlMap插件5分钟搞定SQL注入检测”这个标题,第一反应是:又一个标题党?点开全是截图堆砌、参数照抄、报错就卡住的半…...

音乐解锁工具终极指南:3分钟掌握加密音乐解密技巧

音乐解锁工具终极指南:3分钟掌握加密音乐解密技巧 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://g…...

量子机器学习:平衡数据复杂度与电路表达力的核心策略

1. 项目概述:量子机器学习中的核心平衡艺术在量子机器学习这个前沿交叉领域摸爬滚打了几年,我越来越深刻地意识到,决定一个模型成败的,往往不是最炫酷的量子门设计,而是一个看似基础却极易被忽视的平衡问题&#xff1a…...

保姆级教程:用Python解析北斗广播星历文件(RINEX 3.04格式)并计算卫星坐标

北斗卫星坐标计算实战:Python解析RINEX 3.04星历全流程 当我们需要获取北斗卫星的精确位置时,广播星历文件是最直接的数据来源。这份看似晦涩的文本文件,实际上包含了计算卫星位置所需的所有轨道参数。本文将带你从零开始,完整实现…...