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

数据结构: 红黑树

目录

1.红黑树概念

2.红黑树性质

3.调整

1.如果p和u都是红色,将其都改为黑色即可,然后向上调整

2.如果p红(u黑/u不在),这时候左子树两红,于是给右子树一个红(旋转+变色)

2.1右单旋 + 变色- p变黑, g变红, 达到给右子树一个红节点的效果, 并保持每条路径上黑色节点的个数相同

2.2左右双旋转 + 变色

2.3左单旋 + 变色

2.4右左双选 + 变色

4.红黑树的简单实现

4.1红黑树的定义

4.2相关功能

插入

检查

获取最左/右侧的节点

检查树种是否存在data节点

4.3默认成员函数

测试用例:

1.插入

2.检查

3.获取最左/右侧节点

4.在树种查找节点


1.红黑树概念

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的

2.红黑树性质

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)

最短路径: 全黑

最长路径: 一黑一红交替

红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍

红黑树优势: 旋转次数更少

新插入的节点默认是红色

--1.如果是黑色, 一定违反了规则4 会影响所有路径

--2.如果是红色, 当插入到红色节点后面,违反规则3 , 当插入到黑色节点的后面,不违反规则

3.调整

什么时候需要修改红黑树?--当插入到红色节点后面的时候

1.如果p和u都是红色,将其都改为黑色即可,然后向上调整

  • -然后将g改为红(g原来为黑,我们已经把p,u改为黑了,会多一个黑节点,违反规则4,需要把g改为红)
  • -当然改为红后,g的p可能也是红,继续往上调整即可(把cur = g),如果最后调到根,要将根变黑

2.如果p红(u黑/u不在),这时候左子树两红,于是给右子树一个红(旋转+变色)

-这种情况讨论cur的插入位置 ,来决定其需要怎么旋转(单旋,双旋)

--p是g的左 ,且插入的节点在左子树

2.1右单旋 + 变色
- p变黑, g变红, 达到给右子树一个红节点的效果, 并保持每条路径上黑色节点的个数相同

2.2左右双旋转 + 变色

--p是g的右, 且插入的节点在右子树

2.3左单旋 + 变色

2.4右左双选 + 变色

4.红黑树的简单实现

4.1红黑树的定义

节点

RBTree

4.2相关功能

插入

1.找到节点的位置

2.链接节点

3.判断此时p是不是红色, 且存在 (默认插入的节点是红色), 是的话就需要调整

  --p,u存在且都为红 ===> 直接将p,u变为黑色,g变红色, 然后向上调整,

  如果调到根(要将其变黑)

  --p红, u红/u不在    ===> 对插入节点位置进行讨论

1.p是g的左, cur是 p的左  ===> g右单旋

2.p是g的左, cur是p的右   ===>  p左旋, g右旋

3.p是g的右, cur是p的右   ===>  g左单旋

4.p是g的右, cur是p的左   ===>  p右旋,g左旋

代码:

1.找到节点的位置 2.链接节点

​​​​​​​​​​​​​​

3.判断此时p是不是红色, 且存在 (默认插入的节点是红色), 是的话就需要调整

效果:

检查

  1. 判断根节点是黑色的(规则2)
  2. 判断有无连续的红色节点(规则3)
  3. 判断每条路径上的黑色节点个数是否相等(规则4)                                                             --这里随便选取一条路径的黑色节点数作为基准值, 用来和对比其它路径黑节点的个数

代码:

	//红黑树的检查bool Is_RBTree() {return _Is_RBTree(_root);}//红黑树的检查bool _Is_RBTree(Node* root){//规则2:根节点是黑色的if (root == nullptr) return true;	if (root->_color != BLACK) return false;//规则3:不能有连续的红色节点//规则4:每条路径上的黑色节点个数相等Node* cur = root; int base_nums = 0;while (cur) {if (cur->_color == BLACK) base_nums++;cur = cur->_left;}Check(root,base_nums,0);}bool Check(Node* root,int base_nums,int block_nums) {if (root == nullptr) {if (base_nums != block_nums) return false;return true;}//检查有没有连续的红色节点if (root->_parent && root->_color == RED && root->_parent->_color == RED)return false;//遇到一个黑色节点就++if (root->_color == BLACK) block_nums++;return Check(root->_left,base_nums,block_nums) && Check(root->_right,base_nums,block_nums);}

获取最左/右侧的节点

	//获取红黑树最左侧节点Node* LeftMost(){Node* cur = _root;//空树if (cur == nullptr) return nullptr;while (cur->_left){cur = cur->_left;}return cur;}//获取红黑树最右侧节点Node* RightMost(){Node* cur = _root;//空树if (cur == nullptr) return nullptr;while (cur->_right){cur = cur->_right;}return cur;}

检查树种是否存在data节点

	//检测红黑树中是否存在值为data的节点Node* Find(const T& data){Node* cur = _root;while (cur){if (cur->_data > data)cur = cur->_left;else if (cur->_data < data)cur = cur->_right;else return cur;}return nullptr;}

4.3默认成员函数

--构造函数

这里传了缺省值(可不写)

--拷贝构造

思路:使用前序遍历, 构造红黑树

--赋值运算符

思路: 交换_root

--析构函数

后序遍历,删除节点

测试用例:

1.插入

2.检查

正常情况:

异常:

屏蔽掉颜色的调整

修改默认生成黑色节点

3.获取最左/右侧节点

4.在树种查找节点

代码:RB-Tree/RB-Tree · 朱垚/数据结构练习 - 码云 - 开源中国 (gitee.com)

相关文章:

数据结构: 红黑树

目录 1.红黑树概念 2.红黑树性质 3.调整 1.如果p和u都是红色&#xff0c;将其都改为黑色即可,然后向上调整 2.如果p红&#xff08;u黑/u不在&#xff09;&#xff0c;这时候左子树两红&#xff0c;于是给右子树一个红&#xff08;旋转变色&#xff09; 2.1右单旋 变色- …...

如何搭建开源ERP平台Odoo并实现公网远程访问?——“cpolar内网穿透”

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…...

什么是马尔科夫随机场?

马尔科夫随机场&#xff0c;也称为马尔可夫网&#xff08;Markov Network&#xff09;&#xff0c;是一种概率图模型&#xff0c;用于表示随机变量之间的依赖关系。它是由若干个随机变量组成的无向图&#xff0c;其中节点代表随机变量&#xff0c;边代表它们之间的相互作用或依…...

自然语言处理---huggingface平台使用指南

1 huggingface介绍 Huggingface总部位于纽约&#xff0c;是一家专注于自然语言处理、人工智能和分布式系统的创业公司。他们所提供的聊天机器人技术一直颇受欢迎&#xff0c;但更出名的是他们在NLP开源社区上的贡献。Huggingface一直致力于自然语言处理NLP技术的平民化(democr…...

修炼k8s+flink+hdfs+dlink(六:学习k8s-pod)

一&#xff1a;增&#xff08;创建&#xff09;。 直接进行创建。 kubectl run nginx --imagenginx使用yaml清单方式进行创建。 直接创建方式&#xff0c;并建立pod。 kubectl create deployment my-nginx-deployment --imagenginx:latest 先创建employment&#xff0c;不…...

ARM映像文件组成

引言 ARM编译器将各种源文件&#xff08;汇编文件、C语言程序文件、C语言程序文件&#xff09;编译生成ELF格式的目标文件&#xff08;后缀为.o文件&#xff0c;以下将目标文件简称为.o文件&#xff09;&#xff0c;.o文件经过连接器&#xff0c;和C/C运行时库一起编译生成ELF格…...

redis怎么设计一个高性能hash表

问题 redis 怎么解决的hash冲突问题 &#xff1f;redis 对于扩容rehash有什么优秀的设计&#xff1f; hash 目标是解决hash冲突&#xff0c;那什么是hash冲突呢&#xff1f; 实际上&#xff0c;一个最简单的 Hash 表就是一个数组&#xff0c;数组里的每个元素是一个哈希桶&…...

《软件方法》强化自测题-总纲(6)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 按照业务建模、需求、分析、设计工作流考察&#xff0c;答案不直接给出&#xff0c;可访问自测链接或扫二维码自测&#xff0c;做到全对才能知道答案。 知识点见《软件方法》&#x…...

vue2中,下拉框多选和全选的实现

vue2中&#xff0c;下拉框多选和全选的实现 代码布局在methods: 中添加功能函数较为完整的一个整体代码&#xff1a; 如图所示点击全选即可完成下拉框中全部子项的全部的选中&#xff0c;同时取消全选即可全部取消选择。 代码布局 <div class"chos-box2"><…...

Android-Framework 默认音乐音量最大

代码位置&#xff1a;frameworks/base/services/core/java/com/android/server/audio/AudioService.java -712,6 712,9 public class AudioService extends IAudioService.Stub}} // force music max volume AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] MA…...

formData对象打印不出来

用el-upload上传图片 以流的形式传给后台 所以用formData对象带数据 let formData new FormData() formData.append(name&#xff0c;monkey7) console.log(formData) 明明已经把数据append进去了 console.log在控制台却打印不出 后来发现他得用formData.get("xxx"…...

【Web安全】SQL注入攻击几种常见防御手法总结

文章目录 前言一、使用参数化查询二、输入验证和过滤三、使用存储过程四、最小权限原则五、使用ORM框架六、使用准备语句七、使用安全的数据库连接八、避免动态拼接SQL语句九、使用防火墙和入侵检测系统(一)防火墙(二)入侵检测系统(Intrusion Detection System,简称IDS)十、定期…...

Linux网络编程杂谈(聊聊网络编程背后的故事)

数据是如何传输到物理网络上的&#xff1f; 以TCP为例&#xff0c;当 TCP 决定发送数据时&#xff0c;这些数据需要经过多个处理阶段才能真正被传输到物理网络。其中一个关键步骤是将数据移动到网络接口卡 (NIC)。以下是这个过程的详细描述&#xff1a; 数据序列化: TCP 会为要…...

执行Maven项目时,无法解析项目的依赖关系

报错[ERROR] Failed to execute goal on project pdms-services: Could not resolve dependencies for project ..... 在IDEA ----> setting ---->Remote Jar Repositories ----> Maven jar repositories中添加远程仓库的http地址。 再次进行maven的clean和install就好…...

索引有哪些缺点以及具体有哪些索引类型

索引的优缺点 优点&#xff1a; 合理的增加索引&#xff0c;可以提高数据查询的效率&#xff0c;减少查询时间 有一些特殊的索引&#xff0c;可以保证数据的完整性&#xff0c;比如唯一索引 缺点&#xff1a; 创建索引和维护索引需要消耗时间 索引需要额外占用物理空间 对创建…...

前端学成在线项目详细解析二

12-banner区域-课程表布局 HTML布局 <div class"right"><h3>我的课程表</h3><div class"content">1</div> </div> CSS样式 /* 课程表 */ .banner .right {margin-top: 60px;width: 218px;height: 305px;background-…...

Linux 网卡性能优化设置

在高速网络传输中&#xff0c;每秒传输的数据量非常大。网络设备设置有一种缓存机制&#xff0c;即“缓存区”&#xff0c;在 Linux 系统中&#xff0c;网卡缓冲分为两种类型&#xff1a;软件缓冲区和硬件缓冲区。 要提高网络吞吐率&#xff0c;首先当然是升级linux kernel。其…...

华为OD 最大嵌套括号深度(100分)【java】B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

“微信小程序登录与用户信息获取详解“

目录 引言微信小程序微信登录介绍1. 微信登录的基本概念2. 微信小程序中的微信登录 微信小程序登录的wxLogin与getUserProfile的区别1. wx.login()2. wx.getUserProfile()3.两者区别 微信小程序登录的理论概念1. 微信登录流程2. 用户授权与登录态维护 微信小程序登录的代码演示…...

软考-防火墙技术与原理

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 防火墙概念 根据网络的安全信任程度和需要保护的对象&#xff0c;人为地划分若干安全区域…...

ConvNeXt 系列改进:ConvNeXt 与 Swin Transformer 融合:构建 CSWin 混合 Block,超越纯 CNN

摘要:在 2026 年的计算机视觉(CV)主干网络发展中,纯卷积神经网络(CNN)与纯视觉 Transformer(ViT)的“路线之争”已落下帷幕,“混合架构(Hybrid Architecture)”全面接管了 SOTA 榜单。根据 2026 年 3 月最新发表的多篇顶会与医学视觉核心论文(如 CS-Net、HyCoSwin …...

DLSS文件管理革命:5分钟让每款游戏都获得最佳画质优化

DLSS文件管理革命&#xff1a;5分钟让每款游戏都获得最佳画质优化 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的智能DLSS文件管理工具&#xff0c;能够自动扫描游戏库、识别DLS…...

遥感数字图像处理教程【1.7】

3 . 5 . 3 卷 积卷 积 &#xff08;convolution&#xff09;是空间域上针对特定窗口进行的运算&#xff0c;是图像平滑、锐化中使用的基本计算方法。设窗口大小为冽X % &#xff08;寸 &#xff09;是中心像素,/ &#xff08;》&#xff09;&#xff09;是图像像素值&#xff0…...

LLM部署能耗失控危机(2024能效红皮书核心发现):从千卡集群到单卡边缘的8类能效陷阱

第一章&#xff1a;LLM部署能耗失控危机&#xff08;2024能效红皮书核心发现&#xff09;&#xff1a;从千卡集群到单卡边缘的8类能效陷阱 2026奇点智能技术大会(https://ml-summit.org) 2024年《AI能效红皮书》基于对全球137个生产级LLM服务实例的实测追踪&#xff0c;首次揭…...

5大核心功能深度解析:Jasminum如何重塑你的中文文献管理工作流

5大核心功能深度解析&#xff1a;Jasminum如何重塑你的中文文献管理工作流 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 如果你…...

让开发流程更高效:为 Visual Studio 订阅用户解锁 Syncfusion篮

一、什么是requests&#xff1f; requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你&#xff1a; 轻松发送GET、POST、PUT、DELETE等请求 处理Cookie、会话等复杂性 自动解压缩内容 处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景&#xff1a; …...

绿联NAS使用host模式安装Firefox访问路由器的避坑指南(含端口冲突解决方案)

绿联NAS主机模式部署Firefox访问内网设备的全链路实践 在家庭或小型办公网络中&#xff0c;NAS设备往往需要直接访问路由器管理界面进行配置调整。绿联NAS基于Linux系统的容器化功能&#xff0c;通过主机网络模式&#xff08;host&#xff09;运行Firefox浏览器&#xff0c;能够…...

DDT4All汽车诊断工具:从零开始的终极ECU调参与OBD诊断完整指南

DDT4All汽车诊断工具&#xff1a;从零开始的终极ECU调参与OBD诊断完整指南 【免费下载链接】ddt4all OBD tool 项目地址: https://gitcode.com/gh_mirrors/dd/ddt4all 您是否曾经面对汽车故障码束手无策&#xff1f;是否想要深入了解车辆ECU系统的奥秘&#xff1f;DDT4A…...

深度学习图像分割终极指南:U-Net与ResNet-50的完美融合

深度学习图像分割终极指南&#xff1a;U-Net与ResNet-50的完美融合 【免费下载链接】pytorch-unet-resnet-50-encoder 项目地址: https://gitcode.com/gh_mirrors/py/pytorch-unet-resnet-50-encoder 还在为复杂的图像分割任务发愁吗&#xff1f;今天我要为你介绍一个基…...

倒计时72小时|奇点大会闭门报告流出:大模型工具调用正进入“确定性调度”时代,错过将落后至少18个月

第一章&#xff1a;2026奇点智能技术大会&#xff1a;大模型工具调用 2026奇点智能技术大会(https://ml-summit.org) 工具调用范式的根本性跃迁 本届大会首次将大模型的工具调用&#xff08;Tool Calling&#xff09;从辅助能力升维为原生架构层能力。主流框架如Llama-3.5-To…...