数据结构(7)树形结构——红黑树(概念、插入过程、删除过程)

news2024/11/25 18:46:28

7.1.概述

平衡二叉树是要求任意结点的左右子树高度差不超过1,因此在AVL中用旋转来保证树的绝对平衡,但是这些旋转操作步骤繁多很耗时间,所以在面对经常会有数据插入的场景时,AVL不是一个性能优秀的选择。这时候反过来思考一个问题,旋转是为了保证树的绝对平衡,但是树的绝对平衡是必须的吗?显然不是,树的高度差只要不是太高从而退化成斜二叉树其实就能接受。

红黑树就是一种不严格平衡的,实现平很二叉树思想的二叉树,其通过对结点的染色+少量的旋转操作来保证树的相对平衡,保证树的高度差不会太高,提升了树在数据插入时的效率。

红黑树需要满足以下性质:

  • 整棵树上单个结点的颜色,要么是红色,要么是黑色。
  • 根节点必须为黑色。
  • 父子不能同为红色。
  • 从任何节点出发,到达叶节点经过的黑色节点数量一致。

7.2.操作

7.2.1.插入

插入技巧总结为:

根节点必为黑色,任何调整动作都无法将根节点染红

  • 新插入节点的父节点和uncle节点同为红色,直接染黑父节点和uncle节点,染红祖父节点(如果祖父节点为根节点,就免疫)。
  • 新插入节点的父节点为红色,uncle节点为空或者黑色分以下两种情况处理:
    • 连续红节点同侧(即父节点如果在树的右子树,子节点也是父节点的右节点),以父节点为基准,左旋。
    • 连续红节点异侧,先将祖父节点、父节点变色,然后以祖父节点为基准右旋。
  • 旋转动作后变为叶子节点的节点染红,变为根节点的节点染黑。

(图盗自之前自己的上一个ID的博客,偷个懒了,不想画了,哈哈哈哈~~~)

 7.2.2.删除

1.概述

红黑树的删除其实就是基于二叉搜索树的删除上加入一个调色过程。

在弄清楚红黑树的删除操作之前,需要明白二叉搜索树的删除方法。

首先要明白几个概念:

  • 直接前继
  • 直接后继

直接前继:

当前节点左子树的最右节点。此节点是当前节点左子树中的最大值,也就是左子树区间中值最接近当前节点的节点。

直接后继:

当前节点右子树的最左节点。此节点是当前节点右子树中的最小值,也就是右子树区间中值最接近当前节点的节点。

所以,二叉搜索树的删除思路就是用所要删除的直接前继或者直接后继节点来代替该节点即可。这样整颗二叉搜索树仍然会保持有序。

 

 2.删除过程

删除技巧总结为:

  • 当被删除元素为红时,直接删除。
  • 当被删除元素为黑且为根节点时,直接删除。
  • 当被删除元素为黑,且有一个右子节点为红时,将右子节点涂黑放到被删除元素的位置。
  • 当被删除元素为黑,且兄弟节点为黑,兄弟节点两个孩子也为黑,父节点为红,此时,交换兄弟节点与父节点的颜色;NIL元素是指每个叶节点都有两个空的,颜色为黑的NIL元素,需要他的时候就可以把它看成两个黑元素,不需要的时候可以忽视他。
  • 当被删除元素为黑、并且为父节点的左支,且兄弟颜色为黑,兄弟的右支为红色,这个时候需要交换兄弟与父亲的颜色,并把父亲涂黑、兄弟的右支涂黑,并以父节点为中心左转。
  • 当被删除元素为黑、并且为父节点的左支,且兄弟颜色为黑,兄弟的左支为红色,这个时候需要先把兄弟与兄弟的左子节点颜色互换,进行右转,然后就变成了规则5一样了,在按照规则5进行旋转。
  • 当被删除元素为黑且为父元素的右支时,跟情况5.情况6 互为镜像。
  • 被删除元素为黑且兄弟节点为黑,兄弟节点的孩子为黑,父亲为黑,这个时候需要将兄弟节点变为红,再把父亲看做那个被删除的元素(只是看做,实际上不删除),看看父亲符和哪一条删除规则。

 

 

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

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

相关文章

图神经网络简介

本篇文章是我在2022年阅读完distill上一篇文章"A Gentle Introduction to Graph Neural Networks"后自己的一些心得。 目录 一、不同类型的数据如何以图的形式保存 二、图结构可以处理的问题 三、图机器学习的挑战 四、图神经网络 一、不同类型的数据如何以图的…

【智能优化算法-算术算法】基于算术优化算法 (MAOA)求解多目标优化问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Java并发编程—java中守护线程和用户线程

一、概念: ​ 守护线程:是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程 ​ 用户线程:是系统的工作线程,它会完成这个程序需要完成的业务操作;我们使用 Thread类创建的线…

求先序遍历序列中第(1<=k<=二叉树中结点个数)个结点的值

本题本质上就是一个遍历算法的实现,只不过用一个全局变量的来记录访问的序号,求其他遍历序列的第k个结点也采用相似的方法。二叉树的遍历算法可以引申出大量的算法题,因此考生务必熟练掌握二叉树的遍历算法。 C语言代码: //本题本…

mapbox地图动画一键飞行

最近,Mapbox GL JS 从 v2.9 开始支持将地图显示为 3D 地球。 话不多说,马上看看效果怎么样: mapbox地图动画我们通过设置投影属性projection:globe,即可将地图更改为地球 const map new mapboxgl.Map({container: m…

mybatis实战:二、mybatis xml 方式的基本用法

注释都在代码里,最好复制了再看! 1.创建表 CREATE TABLE sys_user( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 用户 ID, user_name VARCHAR(50) COMMENT 用户名, user_password VARCHAR(50) COMMENT 密码, user_email VARCHAR(50) COMMENT 邮箱, user…

manjaro 记录 1 安装流程

manjaro 记录 1 安装流程 初manjaro 记录 1 安装流程下载好镜像镜像写入U盘重启电脑,进入U盘安装进入界面:找到 launch installer 进行安装安装流程设置语言设置位置与时区设置键盘磁盘分区设置用户与管理员密码安装初 希望能写一些简单的教程和案例分享…

Flink JobManager 内存占用大 问题

Flink JobManager 内存占用大问题 问题描述 当在 本地启动一个 flink 简单的 job 时候,发现出现了 heap outMemeory 问题, 然后就不假思索的 调整了 jvm 的 heap -Xms1000m -Xmx16000m 参数,就可以正常的启动了。 通过 jvisualvm 连接上 这…

实验七 循环神经网络(3)LSTM的记忆能力实验

目录6.3 LSTM的记忆能力实验6.3.1 模型构建6.3.1.1 LSTM层6.3.1.2 模型汇总6.3.2 模型训练6.3.2.1 训练指定长度的数字预测模型6.3.2.2 多组训练6.3.2.3 损失曲线展示6.3.3 模型评价6.3.3.1 在测试集上进行模型评价6.3.3.2 模型在不同长度的数据集上的准确率变化图6.3.3.3 LSTM…

robfig/cron-go cron定时任务库架构剖析

Cron深度解析 思想 对于cron 这个三方库来说,他可以说是做两件事,其一是:解析cron string,生成一个定时器,达到循环时间发送信号。其二是核心(引擎):用以执行,判断&…

Spring基础篇:Spring简介

第一章:Spring简介 SpringIOC工厂是Spring所有特性的基础,Spring所有的特性都是基于IOC控制反转特性而来的。 当今微服务已经成为主流,微服务依赖于SpringBoot和SpringCloud,而SpringBoot和SpringCloud是衍生于Spring&#xff0c…

贺利坚汇编课程笔记2 访问寄存器和内存

贺利坚汇编课程笔记2 访问寄存器和内存 文章目录贺利坚汇编课程笔记2 访问寄存器和内存0201 寄存器及数据存储CPU的组成寄存器是CPU内部的信息存储单元通用寄存器--以AX为例“字”在寄存器中的存储0202 mov 和 add指令0203 确定物理地址的方法物理地址8086CPU给出物理地址的方法…

pytorch模型网页部署——Flask

一、Flask用法 Flask是python的轻量级web框架,可用来做简单的模型部署。Flask的基本用法如下: step1:定义Flask类的对象,即创建一个基于Flask的服务器 step2:定义公开的路由及路由对应的调用函数 step3&#xff1a…

分享新零售系统商城小程序开发制作功能介绍_商城小程序开发好处

小编主要专注于新零售系统开发商城的领域,新零售系统开发商业模式有哪些: ① 多种销售模式:邀请有奖、销售业绩奖、团队业绩奖、区域分红,分销模式等。 ② 团队协作功能:立即邀约分销模式,清楚搜索直属代…

大型ERP生产制造管理系统源码

🍓🍓【淘源码】:一个专业提供高品质源码免费下载的资源共享平台🍓🍓 👇👇👇以下是博主整理的淘源码网站内大家都比较感兴趣的一些源码,需要源码学习的朋友可以私信博主哦…

Exception | ShardingSphere | ShardingSphere引发的IndexOutOfBoundsException

ShardingSphere引发的IndexOutOfBoundsException一、异常二、 原因三、解决方法四、总结一、异常 ### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 ### The error may exist in file [D:\JetBrains\Idea\workspace\zohe\bjxz\ru…

N-gram和NNLM语言模型

背景: one-hot:缺点:1.高维稀疏,2.不能体现句子中词的重要性,3.不能体现词与词之间的关系。 embedding:1.解决了高维稀疏 tf-idf:2.解决了one-hot中不能体现句子中词的重要性这一特点。 语言模型:3.解决不能…

【20221201】【每日一题】划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 思路&…

协程Part1-boost.Coroutine.md

首先,在计算机科学中 routine 被定义为一系列的操作,多个 routine 的执行形成一个父子关系,并且子 routine 一定会在父 routine 结束前结束,也就是一个个的函数执行和嵌套执行形成了父子关系。 coroutine 也是广义上的 routine&a…

网页JS自动化脚本(五)修改文字元素的内容和大小

今天的网页打开全是灰色的,顺便缅怀一下伟人,那么我我们今天定位换成按钮文字 window.onloadfunction(){var theElementdocument.querySelector("input[typesubmit]");theElement.value"爱我中华";theElement.style"font-size:25px"; }这一次的…