【红黑树】红黑树插入操作相关的细节和疑难拆解分析

news2025/7/22 15:16:26

本文就红黑树的插入操作进行细致到每一个小步骤的解析。

1,成员变量

本红黑树使用了三叉链结构,使用的时候尤其要记得处理指向父亲的指针。

为何在节点的构造函数中,默认节点的颜色为红色?

因为考虑到红黑树的性质(对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点),所以设置为红色是最为合理方便的,如果插入的时候会有连续的红色节点,再做调整也很方便。

但是如果默认为黑节点,就要做调整保证每个路径上的黑节点相同,相比之下会很麻烦。

2,Insert函数的实现(分为各个细节讨论)

2,1插入时,红黑树是否为空树

考虑到此情况,要先判断红黑树是否为空树。

若是,进行相关操作后return

若不是,向下进行

2,2若不是空树,迭代到树的底部,并插入节点

不必担心parent的空指针解引用问题,由于不是空树,所以parent一定不会为nullptr。

2,3插入节点后,控制平衡

理论基础:

理论:(我们先约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点)

情况一: cur为红,p为红,g为黑,u存在且为红

如下图:

此图是个抽象图,代表着多种情况,带省略号的长方形表示一个未知的树。

解决方法:

将p,u改为黑,g改为红,然后把g当成cur,继续向上调整

如果g是根节点,调整完成后,需要将g改为黑色(其实只要在调整操作的最后将_root的颜色置为黑色就行,不必在每种情况下特殊处理)

如果g是子树,g一定有双亲,且g的双亲如果是红色,需要继续向上调整。

——————————————————————————————————————

情况二: cur为红,p为红,g为黑,u不存在/u存在且为黑,且为单旋情况

如下图:

如下图:

解决方法:

p为g的左孩子,cur为p的左孩子,则进行右单旋转;相反,

p为g的右孩子,cur为p的右孩子,则进行左单旋转

p、g变色--p变黑,g变红

旋转函数:

1,左单旋

解释:

要实现一个操作,往往有多种方法,函数的设计也有多种。

本人选择将旋转函数参数统一设置为要处理的两个节点中处于上方的节点。

如图:

于是,写出代码实现如下:

cur是node的右子节点,parent是node的父节点。

要特别注意,此时使用的是三叉链结构,在链接节点的同时,一定不要忘记对_parent进行处理

在对_parent进行处理时,当然也要注意_parenrt是否存在,所以我们还要判断node是否为根节点,再进行相关操作。

2,右单旋

分析同上,不在赘述。

如下图:

代码实现:

————————————————————————————————————————

在插播了左单旋和右单旋的实现后,继续回来讨论第三种情况

情况三:cur为红,p为红,g为黑,u不存在/u存在且为黑,且需要双旋

有了以上基础,此处直接上图。

解决方法:

p为g的左孩子,cur为p的右孩子,则针对p做左单旋转,再对g做右单旋转;相反,

p为g的右孩子,cur为p的左孩子,则针对p做右单旋转,再对g做左单旋转。

将cur置为黑色,g置为红色

代码实现:

复用左单旋和右单旋即可。

代码实现:

解释:

整个循环结束的条件是parent不存在或者parent为黑色

并且不必担心祖父是否存在,因为如果parent && parent->_col == RED的话,

祖父节点一定存在,并且为黑色,因为parent为红色节点,不可能是根节点。

如果是第一种情况的话,是需要迭代调整的:要将g的位置变为cur,继续向上检查。

而第二三种情况则不需要,因为旋转了之后,没有对上层产生影响,所以可以在调整之后直接跳出

循环结束后,将_root置为黑色,保证结构即可。

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

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

相关文章

汇编语言 标志位总结

缩写原意: Overflow of = OV NV [No Overflow] Direction df = DN (decrement) UP (increment) Interrupt if = EI (enabled) DI (disabled) Sign sf = NG (negative) PL (positive) Zero zf = ZR [zero] NZ [ Not zero] Auxiliary Carry af = AC NA [ No AC ] Parity pf = PE…

计网个人作业05

R1 链路层可以提供如下服务 链路层服务IP能否提供?TCP能否提供?流量控制✔差错检测✔✔差错纠正全双工、半双工✔ R2 不冗余 IP层有丢包的情况⼀个⻓的 TCP 报⽂段会被分⽚成多个 IP 数据报形成不同的帧,不同的帧可能会被不同链路传输。同…

二.线性表之顺序表

文章目录前言一.顺序表的概念及结构二.顺序表的接口实现1.顺序表的动态存储2.顺序表的初始化3.顺序表尾插#封装:扩容函数4.顺序表尾删5.顺序表头插6.顺序表头删7.顺序表查找8.顺序表在pos位置插入x9.顺序表删除pos位置的值10.顺序表销毁11.顺序表打印三.源1.Seqlist…

3000字,聊一聊学习低代码和学习编程到底有什么区别?

作者介绍胡艳平,万应低代码联合创始人、CTO,中国信通院低代码/无代码推进中心技术专家,全国信标委《低代码开发平台能力要求》起草人之一。曾有科技公司CTO问我:低代码是不是一种不用敲代码的编程语言?在不确定低代码能…

机器人学习的坚持与收获-2023

所有的机会都需要自己努力去争取,毕竟天会下雨下雪,但是不会掉馅饼。之前写过关于毕业生的一些博文。机器人工程ROS方向应用型本科毕业设计重点课题学生验收成果(暂缓通过)机器人工程ROS方向应用型本科毕业设计重点课题学生验收成…

如何让人机对话更自然?

来源:投稿 作者:顾相欢 编辑:学姐 AAAI-2022|定制对话的人设和知识背景 原文标题: Call for Customized Conversation: Customized Conversation Grounding Persona and Knowledge 原文链接: https://arxiv.org/ab…

分类预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆网络数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆网络数据分类预测 目录分类预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆网络数据分类预测分类效果基本描述程序设计参考资料分类效果 基本描述 1.Matlab实现WOA-CNN-BiLSTM鲸鱼算法优化卷…

Ubuntu下gcc多版本管理

Ubuntu下多gcc版本的管理 开发过程中,在编译一个开源项目时,由于代码使用的c版本过高,而系统内置的gcc版本过低时,这个时候我们就需要升级gcc版本,但是为了避免兼容性问题,安装多个版本的gcc,然…

uniapp中调用.net6 webapi

使用uniapp开发程序时,不管是小程序,还是H5界面,它们只是一个显示界面,也就是只充当前台界面,那么我们后台使用.net6 webapi写业务逻辑,然后前端访问后端,即可实现前后端分离开发软件的模式。 …

连不上虚拟机我谁都怀疑了!唯独没怀疑VirtualBox这个浓眉大眼的家伙!

这里写自定义目录标题一、问题和现象环境二、思考和尝试三、问题原因VirtualBox NAT模式的坑四、解决办法1、双网卡2、配置转发端口一、问题和现象 fileZilla连接不上虚拟机(Linux/centOS)。 ping不通虚拟机。 ssh连接不上虚拟机。 环境 Win10主机使用…

上岸16K,薪资翻倍,在华为外包做测试是一种什么样的体验····

现在回过头看当初的决定,还是正确的,自己转行成功,现在进入了华为外包测试岗,脱离了工厂生活,薪资也翻了一倍不止。 我17年毕业于一个普通二本学校,电子信息工程学院,是一个很不出名的小本科。…

吃透8图1模板,人人可以做架构

前言 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴问尼恩: 大佬,我们写架构方案, 需要从哪些方面展开 大佬,我们写总体设计方案需要一些技术亮点,可否发一些给我参考下 诸如此类,问法很多…

Serverless Kubernetes的思考与征程

​作者:牛秋霖、张维、李传云、易立 本文将针对Serverless Container技术的特殊性,分享其对Kubernetes的架构影响,以及阿里云在Serverless Kubernetes方面架构选择。 一、Serverless Container缘起 在2018年,容器团队与弹性计算团…

9 种会让你大吃一惊的副业工具

然而,副业需要使用许多工具。我举个例子:我在网上写文章,做数字产品,需要用到各种工具。相信我,免费的互联网工具可以帮助我快速完成工作,这样我就可以赚更多的钱并有更多的空闲时间。注意:这些…

初阶C语言——指针【详解】

文章目录1.指针是什么2.指针和指针类型2.1 指针的解引用2.2 指针 -整数3.野指针3.1 野指针成因3.2 如何规避野指针4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算5. 指针和数组6. 二级指针7. 指针数组1.指针是什么 指针理解的2个要点: 指针是内存中一个最…

【LeetCode】2357. 使数组中所有元素都等于零

2357. 使数组中所有元素都等于零 题目描述 给你一个非负整数数组 nums 。在一步操作中,你必须: 选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。nums 中的每个正整数都减去 x。 返回使 nums 中所有元素都等于 0 需要的 …

【JavaScript速成之路】JavaScript运算符

📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 文章目录前言运算符1,算术运算符2,递增递减运算符3,比…

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image)

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image) VMware ESXi 7.0 Update 3k Standard & All Custom Image for ESXi 7.0 U3k Install CD 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3/,查看最新版。原创作品…

程序员必备的软技能-金字塔原理拆解(上)

原书 290千字,本文预计 14千字,拆解比 20:1,预计阅读时长 15分钟序言日常工作中,常常因为思维、表达方式不对产生不想要的结果:写了一个小时的周报,领导却不满意?跟团队讲了半天自己…

SWMM从入门到实践教程 01 SWMM软件介绍

文章目录1 软件介绍2 软件面板2.1 主菜单2.1.1文件菜单(File)2.1.2 编辑菜单(Edit)2.1.3 视图菜单(View)2.1.4 工程菜单(Project)2.1.5 报告菜单(Report)2.1.…