二叉搜索树进阶之红黑树

前言:

在上文我们已经学习了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.rhkb.cn/news/412055.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记——后端项目中的相关技术 【随时更新】

文章目录 1. Session 共享1.0 cookie和session的工作流1.1 Cookie范围1.2 为什么要共享?1.3 如何共享存储1.4 session共享实现 2. 缓存的实现2.1 缓存分类2. 2 Redis 缓存实现2.1.1 Spring data redis(推荐使用)2.1.2 Redis 的数据结构&#…

C++----简单了解vector

大家好,今天我们来讲讲与string相似的向量类型。之所以说他们是相似的原因是他们其中的数据类型有些效果都是一样的。当然大家不能说,既然是差不多的干嘛还有一个这个啊。不如直接用string就可以了。当然世界名言存在即合理。既然我们都能想到的东西&…

金融知识普及月答题活动

金融知识普及月答题活动 关键词:金融安全、风险防范、金融常识、反诈宣传 推荐功能:答题、倡议书 宣传角度: 1. 普及金融知识:讲解货币、信用、利率、汇率等基本金融概念,以及储蓄、贷款、信用卡、保险等常见金融产…

Unity 图表插件Xcharts的一些坑

XY轴、图例文字不清晰。 2种方法解决 1:老套路,先放大再缩小,像素点多了就清晰了。 2:设置一个单独渲染的UI相机,把canvs所在的UI层级使用深度相机单独渲染,另一个选剔除UI的纯色或天空盒。同时,把改Canva…

基于Spring Boot的文字识别系统

前端使用htmlcssjs,后端使用Spring Boot,数据库使用mysql,识别算法有两个,一个是使用百度OCR接口,一个是自己写一个python,用flask包装。 其中百度OCR接口可以去免费申请,然后把appid、apikey、…

Java Web_00001

目录 Web项目介绍网页的组成部分 HTMLHTML简介HTML示例HTML文件的书写规范HTML标签标签介绍标签的语法:常用标签font特殊字符标题标签超链接列表标签img标签表格标签跨行跨列表格iframe框架标签(内嵌窗口)表单标签表单的显示表单格式化表单提交细节 其他标签 CSSCSS…

OpenHarmony轻松玩转GIF数据渲染

OpenAtom OpenHarmony(以下简称“OpenHarmony”)提供了Image组件支持GIF动图的播放,但是缺乏扩展能力,不支持播放控制等。今天介绍一款三方库——ohos-gif-drawable三方组件,带大家一起玩转GIF的数据渲染,搞…

CI/CD实践(五)Jenkins Docker 自动化构建部署Node服务

微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)服务器先决准备 微服务CI/CD实践(三)gitlab部署及nexus3部署 微服务CI/CD实践(四&#xff09…

GraphPad Prism下载安装教程怎样中文汉化

GraphPad Prism下载安装教程怎样中文汉化: GraphPad Prism 是一款集生物统计、曲线拟合和科技绘图于一体的软件,主要用于医学和生物科学领域的数据分析和绘图,具有高效、简便、多功能和高质量的特点,被广泛应用于科研、教育和业界…

湖南的智榜样网络安全公司开的培训学校参加学习成为网络安全工程师

学习网络安全可以通过以下步骤进行: 获取基础知识:开始学习网络安全之前,建议先获取一些计算机基础知识,包括计算机网络、操作系统、编程语言等方面的知识。这些基础知识将为你理解和学习网络安全提供必要的背景。 学习网络安全基…

安卓13去掉权限动态申请,默认授权,不用动态申请权限

总纲 android13 rom 开发总纲说明 1、前言 2、问题分析 3.代码处理 4.代码修改 5.编译 6.彩蛋 1、前言

day44——C++对C的扩充

八、C对函数的扩充 8.1 函数重载(overload) 1> 概念 函数重载就是能够实现"一名多用",是实现泛型编程的一种 泛型编程:试图以不变的代码,来实现可变的功能 2> 引入背景 程序员在写函数时&#x…

C++语法基础(二)

C复合类型 结构体 1. C的结构,定义结构体类型的变量时,可以省略struct关键字 2. 可以定义成员函数,在结构体中的成员函数内部可以直接访问本结构体的成员,无需通过“.”或“->” 联合 1. C的联合,定义联合体类型的变…

Linux系统ubuntu20.04 无人机PX4 开发环境搭建(失败率很低)

PX4固件下载 PX4的源码处于GitHub,因为众所周知的原因git clone经常失败,此处从Gitee获取PX4源码和依赖模块。 git clone https://gitee.com/voima/PX4-Autopilot.git 正克隆到 ‘PX4-Autopilot’… remote: Enumerating objects: 454209, done. remot…

Apache CloudStack Official Document 翻译节选(十二)

快速部署一朵 Apache CloudStack 云 (一) 部署前的准备工作 Apache CloudStack快速部署指南 我们究竟在构建什么? 构建IAAS云是一件很复杂的事项,根据相关定义,构建IAAS云的可选项有很多。这些纷繁复杂的概念通常给…

WLAN原理实验简述——AP上线

一、需求: AP通过AC上线。 AC通过控制VLAN管理AP,创建VLAN100和放行。 AP同AC建立CAPWAP关系。 二、实验拓扑图: 三、实验步骤: LSW1: sys Enter system view, return user view with CtrlZ. [Huawei]Sysname lsw1 [lsw1]undo info enable I…

扩散模型(Diffusion Model)

扩散模型(diffusion model)是一种运用了物理热力学扩散思想的生成模型。扩散模型有很多不同的变形,本文主要介绍最知名的去噪扩散概率模型(Denoising Diffusion Probabilistic Model,DDPM)。如今比较成功的…

Notepad++回车不自动补全

问题 使用Notepad时,按回车经常自动补全,但我们希望回车进行换行,而不是自动补全,而且自动补全使用Tab进行补全足够了。下文介绍设置方法。 设置方法 打开Notepad,进入设置 - 首选项 - 自动完成,在插入选…

Windows上MSYS2的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下载二、安装三、使用1.打开命令行2.搜索软件3.安装软件4.卸载软件5.更新环境6.其他四、MSYS2和Cygwin的差别总结前言 MSYS2这个工具我是越用越喜欢,很多东西放在Linux上如鱼得水但是放在…

禁止文件外发 | 如何禁止员工外发文件?严守企业机密,禁止员工外发敏感文件!

近期,我们注意到一些敏感项目资料有外泄的风险,这对公司的核心竞争力构成了严重威胁! 我们必须立即采取行动,严守企业机密,确保每一份文件都安全无虞。 从今天起,我们要全面升级信息安全措施,…