二叉搜索树进阶之红黑树

news2024/11/15 23:46:33

前言:

在上文我们已经学习了AVL树的相关知识以及涉及的四种旋转的内容,但是AVL树追求平衡导致旋转操作过多,一些情况下影响性能,由此我们就来了解一下二叉搜索树的另外一个分支,红黑树。

(倘若对旋转知识不了解的可以先移步:http://t.csdnimg.cn/waigV)

红黑树的概念:

红黑树是一种二叉搜索树,通过对每个节点增加一个存储位表示节点的颜色,(红色或者黑色),再通过对任何一条从根到叶子的路径的各个节点的着色方式进行限制,从而保证没有一条路径会比其他路径长出两倍,从而确保诸多基本操作例如插入删除和查找的时间复杂度始终O(log⁡n)。

红黑树被广泛运用道许多计算机科学领域,比如C++的stl库的map与set容器的底层实现,java的TreeMap与TreeSet也采用了红黑树。

 红黑树的性质:

1. 每个结点不是红色就是黑色
2. 根节点是黑色的 
3. 如果一个节点是红色的,则它的两个孩子结点是黑色的 
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点 
5. 每个叶子结点都是黑色的 ( 此处的叶子结点指的是空结点)
只要满足上面五种条件,就能保证没有一条路径会比其他路径长出两倍,确保了红黑树不会变得过于不平衡,从而保证了高效的操作。

红黑树的性质的平衡:

红黑树是否进行旋转主要是依据他的叔叔节点进行判断的,以红黑树的插入操作为例,当我们在叶子处插入新节点时,要把它的默认颜色设置为红色,然后对比他的父节点颜色是否为红,为红色就要进行一系列的检查,为黑,就不用进行检查。
通常我们面临的需要选择的情况是这样的:
cur为我们新插入的节点,此时他的父亲节点parent的颜色也为红,于是找到父亲的父亲节点pparent,随后判断parent是pparent的左节点还是右节点,随后就能找到叔叔节点uncle。重要的就来了,当此时叔叔节点也为红色时,我们就可以把parent与叔叔的颜色更改为黑色,随后把爷爷节点颜色改为红色。在这种情况下,我们就不用对红黑树进行任何旋转,但是由于我们更改了爷爷节点的颜色为红色,所以我们要继续对爷爷进点进行又一次的判断。
由此可见,cur的位置其实不一定为新插入的节点,也可能时一路调整上来的节点:

 

比如这张图来看,最底下的节点为新增,此时我们就要把a,b颜色更改为黑,把cur颜色更改为红,此时cur与parent的眼色都为红,违反了规则,所以要继续进行判断。
总之,当我们检查到叔叔节点的颜色为红色,跟父亲一样时,就不需要进行旋转,只需要更改颜色就行。
但是如果叔叔节点为黑色或者叔叔节点不存在时,单纯进行颜色的更改已经不能满足我们的红黑树的五大规则了,所以只能进行旋转了。

叔叔存在但是为黑色: 

此时只能对爷爷节点进行旋转,以图片的情况为例,就是对爷爷节点进行右单旋,然后交换爷爷节点与父亲节点的颜色就可以了。

这种情况自然也是进行左单旋。

那么什么时候进行双旋呢?

对于红黑树来说,当父亲节点时爷爷节点的左节点时,cur节点是父亲节点的右节点,就可以进行左右双旋操作。或者当父亲节点时爷爷节点的右节点,cur是父亲节点的左节点,就对爷爷节点进行右左双旋操作来保持红黑树的性质。 

红黑树的优缺点

优点

  • 红黑树的插入、删除和查找操作的时间复杂度始终为 O(log⁡n)O(\log n)O(logn),适合频繁插入和删除的动态数据集。
  • 红黑树能够保持相对较好的平衡,避免了极端情况下的退化。

缺点

  • 相对于 AVL 树,红黑树的平衡程度稍差,这意味着查找操作的性能在某些情况下可能不如 AVL 树。
  • 实现红黑树比其他二叉搜索树(如普通的二叉搜索树或 AVL 树)要复杂得多。

结语

红黑树在计算机科学中有着广泛的应用,尤其是在需要频繁插入和删除操作的数据结构中。虽然其实现较为复杂,但红黑树通过严格的平衡规则和旋转操作,能够提供稳定、高效的性能表现,是一种非常重要的自平衡二叉搜索树。了解红黑树的基本性质和操作过程,对于深入理解高级数据结构以及其在实际应用中的优化是非常有帮助的。

希望本文对您有所帮助!!

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

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

相关文章

詹娜奥尔特加看到自己青少年时期露骨AI照片后删除了推特:“这太恶心了”

詹娜奥尔特加看到自己青少年时期露骨AI照片后删除了推特:“这太恶心了” 2024-08-25 23:07 发布于:河北省 21 岁的奥尔特加承认她仍在学习如何保护自己,一种有帮助的方法是“尽可能避免使用手机”。 这位女演员表示,看到“剪…

算法: 双指针

题目:环形链表 题目讲解: 判断环 要判断链表是否有环,可以使用快慢指针的方法。快指针每次走两步,慢指针每次走一步。如果链表有环,快慢指针最终会相遇;如果没有环,快指针会先到达链表末尾。 …

该部署公钥无权限拉代码

从阿里云云效的代码库中执行git pull时报错如下: git pull该部署公钥无权限拉代码 fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.原因是该代码库在云效上未启用密钥,…

【Material-UI】Select 组件中的 `Auto width`、`Small Size` 和 `Other Props` 详解

文章目录 一、Select 组件概述1. 组件介绍2. Select 组件的基本结构 二、Auto width 属性详解1. Auto width 的作用2. Auto width 属性的基本用法3. Auto width 的实际应用场景 三、Small Size 属性详解1. Small Size 的作用2. Small Size 属性的基本用法3. Small Size 的实际应…

三分钟总结开源流程表单的优势特点

实现流程化办公,可以借助低代码技术平台、开源流程表单的优势特点。作为当前较为理想的平台产品,低代码技术平台凭借够灵活、好操作、可视化界面的优势特点,得到了通信业、医疗、高校等很多行业客户朋友的喜爱与支持。今天一起来看看开源流程…

vue2.0纯前端预览附件方法汇总

vue2.0纯前端预览附件方法汇总 一、使用iframe预览1.使用 Office 在线查看器2.XDOC文档预览服务XDOC官网地址:[https://view.xdocin.com/](https://view.xdocin.com/) 二、vue-office具体效果可以参考: [https://501351981.github.io/vue-office/examples/dist/#/docx](https:/…

linux下使用xargs批量操作

1、创建测试文件: for i in {1..4}; do touch $i.gz; done;2、将所有gz文件重命名为.gz.log2文件 ls | xargs -I {} sh -c mv {} {}.log2 3、将所有.log2文件改回为.gz文件 ls | xargs -I {} sh -c mv {} $(echo {} | sed "s/\.log2//g" ) 4、将所有的…

优先级队列面试题详解

题目链接: . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/smallest-k-lcci/description/ 解题思路&#x…

新华三H3C HCL配置IS-IS基本配置

实验目标 完成本实验,应该能够达到以下目标。 ●掌握如何在路由器进行单区域IS-IS的基本配置 ●掌握如何在路由器上查看IS-IS路由表、邻居信息 ●掌握如何在路由器上查看IS-IS的LSDB信息 实验拓扑 IP地址表 实验任务 单区域配置: 在本实验任务中,需要在路由器上…

STM32标准库HAL库——MPU6050原理(卡尔曼滤波和DMP库处理数据)和代码

目录 陀螺仪相关基础知识: 陀螺仪数据处理的三种方式: 加速度计,陀螺仪的工作原理: 陀螺仪在智能车中的应用: MPU6050原理图和封装图: ​编辑 硬件IIC和软件IIC的区别: 相同点 不同点 …

MagiskBoot编译解包打包boot.img

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 编译环境准备 1. Windows下启用开发者模式,因为需要 symbolic link 支持 2. 安装 python3.8,并配置PATH环境变量 # 查看python版本信…

kali——sqlmap的使用

目录 前言 sqlmap在kali中的使用 检测注入点 产看所有数据库 查看当前网站使用的数据库 产看数据表 查看字段 查看字段数据 查看数据库用户 查看所有用户 获取数据库用户密码 查看用户权限 判断当前数据库用户是否是管理员 批量自动化扫描 post请求注入 cookie…

html+css+js网页设计 婚庆类型 金夫人婚庆5个页面

htmlcssjs网页设计 婚庆类型 金夫人婚庆5个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 …

时序预测 | 基于WTC+transformer时间序列组合预测模型(pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 WTCtransformer时间序列组合预测模型 WTC,transformer 创新点,超级新。先发先得,高精度代码。 预测主模型transformer也可以改其他WTC-former系列,比如WTC-informer/autoformer等等…

STM32ADC(逐次逼近型)

1 ADC Analogto DigitalConverter 1 模拟信号转换器数字信号 2 幅度上是离散的(也就是把自然界的信息转换成单片机里面的信息) 2 12位逐次逼近型ADC 1 采样深度是指:用多少位二进制数来表示一个采样点 ADC的采样深度越深 转…

Prometheus之Blackbox监控

Prometheus之Blackbox监控 部署Blackbox 下载地址 https://github.com/prometheus/blackbox_exporter这里使用amd64架构的软件包,根据自己设备架构选择 右键复制链接地址 下载软件包 wget https://github.com/prometheus/blackbox_exporter/releases/download/v0…

海绵城市雨水监测系统

海绵城市雨水监测系统主要有:数据采集、无线数据传输、后台云服务、终端平台显示等部分组成。系统通过前端数据采集水质(ss\cod\浊度、PH等)、雨水雨量、流量、水位、土壤湿度、气象等数据。通过无线数据传输通讯(4G、5G、以太网、…

电力电容器一般用多久更换

电力电容器的更换周期取决于多个因素,包括其工作环境、使用条件、维护情况等。一般情况下,电力电容器的更换周期可以参考以下几个方面: 一、标准使用寿命 1、普通电力电容器: 使用寿命:通常为 8 到 15 年。这个范围可…

新神器!分享6款毕业AI论文写作推荐免费网站

在当今学术研究和写作领域,AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。以下是六款值得推荐的AI毕业论文开题报告一键生成网站: 一、千笔-AIpassp…

软件测试——测试分类

测试分类 按照测试目标测试 界面测试 页面内展示的所有内容/元素都需要测试 参考UI图找不同 功能测试 ​ 如何设计功能测试用例? 参考产品规格说明书进行用例的编写,具体的测试用例需要使用黑盒设计测 试用例的方法,如等价类、边界值、…