红黑树及其插入修复方法

树 —— 红黑树 源代码地址:https://github.com/Zheng-Wenkai/DataStructure.git 一,红黑树的介绍 1. 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 2. 在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(logn)。 阅读详情

一、红黑树的介绍
先来看下算法导论对R-B Tree的介绍:
红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

红黑树,作为一棵二叉查找树,满足二叉查找树的一般性质。下面,来了解下 二叉查找树的一般性质。

二叉查找树

二叉查找树,也称有序二叉树(ordered binary tree),或已排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
任意节点的左、右子树也分别为二叉查找树。
没有键值相等的节点(no duplicate nodes)。
因为一棵由n个结点随机构造的二叉查找树的高度为lgn,所以顺理成章,二叉查找树的一般操作的执行时间为O(lgn)。但二叉查找树若退化成了一棵具有n个结点的线性链后,则这些操作最坏情况运行时间为O(n)。

红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。

但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质:

**每个结点要么是红的要么是黑的。
根结点是黑的。
每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
如果一个结点是红的,那么它的两个儿子都是黑的。
对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。**

二、树的旋转知识

如果插入的是根结点,由于原树是空树,此情况只会违反性质2,因此直接把此结点涂为黑色;如果插入的结点的父结点是黑色,由于此不会违反性质2和性质4,红黑树没有被破坏,所以此时什么也不做。

● 插入修复情况1:如果当前结点的父结点是红色且祖父结点的另一个子结点(叔叔结点)是红色
此时父结点的父结点一定存在,否则插入前就已不是红黑树。与此同时,又分为父结点是祖父结点的左孩子还是右孩子,根据对称性,我们只要解开一个方向就可以了。这里只考虑父结点为祖父左孩子的情况,如下图所示。
对此,我们的解决策略是:将当前节点的父节点和叔叔节点涂黑,祖父结点涂红,把当前结点指向祖父节点,从新的当前节点重新开始算法。

● 插入修复情况2:当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的右子
当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。

● 插入修复情况3:当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的左子
解决对策是:父节点变为黑色,祖父节点变为红色,在祖父节点为支点右旋.最后,把根结点涂为黑色,整棵红黑树便重新恢复了平衡

红黑树的删除
如果是以下情况,恢复比较简单:
a)当前节点是红+黑色
解法,直接把当前节点染成黑色,结束此时红黑树性质全部恢复。
b)当前节点是黑+黑且是根节点, 解法:什么都不做,结束。

删除修复情况1:当前节点是黑+黑且兄弟节点为红色(此时父节点和兄弟节点的子节点分为黑)。
解法:把父节点染成红色,把兄弟结点染成黑色,之后重新进入算法(我们只讨论当前节点是其父节点左孩子时的情况)。此变换后原红黑树性质5不变,而把问题转化为兄弟节点为黑色的情况(注:变化前,原本就未违反性质5,只是为了把问题转化为兄弟节点为黑色的情况)。

删除修复情况2:当前节点是黑加黑且兄弟是黑色且兄弟节点的两个子节点全为黑色。
解法:把当前节点和兄弟节点中抽取一重黑色追加到父节点上,把父节点当成新的当前节点,重新进入算法。

删除修复情况3:当前节点颜色是黑+黑,兄弟节点是黑色,兄弟的左子是红色,右子是黑色。
解法:把兄弟结点染红,兄弟左子节点染黑,之后再在兄弟节点为支点解右旋,之后重新进入算法。此是把当前的情况转化为情况4,而性质5得以保持

删除修复情况4:当前节点颜色是黑-黑色,它的兄弟节点是黑色,但是兄弟节点的右子是红色,兄弟节点左子的颜色任意。
解法:把兄弟节点染成当前节点父节点的颜色,把当前节点父节点染成黑色,兄弟节点右子染成黑色,之后以当前节点的父节点为支点进行左旋,此时算法结束

附:
http://blog.youkuaiyun.com/v_JULY_v/article/details/6105630 教你初步了解红黑树
http://blog.youkuaiyun.com/silangquan/article/details/18655795 红黑树面试问题

轻松搞定面试中的红黑树问题 立即下载

相关推荐

MacBook 上 LaTeX 环境搭建:从 Mactex 到 Sublime Text 与 Skim 的保姆级配置流程

本文详细介绍了在MacBook上搭建LaTeX环境的完整流程,从Mactex安装到Sublime Text与Skim的配置优化。涵盖基础环境准备、编辑器设置、PDF预览同步等关键步骤,帮助用户快速建立高效的LaTeX工作流,特别适合学术写作和技术文档创作。

weixin_30824599的博客 681

红黑树总结

1、红黑树的性质 2、插入操作 查找插入的位置:插入节点的颜色必须是红色,插入黑色节点会破坏平衡 插入后自平衡 红黑树插入情景分析: (1) 情景1:红黑树为空树 将插入节点作为根节点,然后将根节点设置为黑色 (2) 情景2:插入点的key已存在 替换原节点的value值 (3) 情景3:插入节点的父节点是黑节点 直接插入,不会影响自平衡 (4) 情景4:插入节点的父节点是红节点 根据性质2:父节点为红色一定

qq_33513600的博客 253

IEEE ACCESS Please note that all author names should be listed in English.(所有作者名需用英文名列出)

很奇怪哈,我明明手稿和提交页面作者都是用的英文,但是为什么还是会提示我没用英文呢?后来给编辑发消息,回的很快,他给我发了一个截图,确实是出现中文,但是我还是不知道为啥会出现中文。直到晚上回寝室洗澡的时候忽然想起来了是不是orcid的原因,因为它会强制作者绑定一个orcid账号,而我的orcid账号的名字刚好是中文的。当然这个只是我的一个猜想,但是我觉得可能性很大。我的第二篇论文已经投稿了快三个月了,效果非常的不好,所以我打算转投IEEE ACCESS了,希望这里可以给我一点好的建议。

kuyecsl的博客 3310

红黑树插入修正和删除修正详解

红黑树概念请戳:点击打开链接-http://www.sohu.com/a/201923614_466939红黑树代码请戳:点击打开链接-https://www.cnblogs.com/skywang12345/p/3624343.html---------------------------------------------------------------------------------...

CoderPOPO的博客 1779

[数据转换]将NetCDF(NC)文件转换成单个GeoTIFF文件

有时候要提取tif格式数据中的气象数据,但从气象网站上下载的却是NC格式的文件。这就需要我们将NC格式的文件转换成TIF格式的文件。

G_sea_young的博客 1004

欧姆龙NX控制器与Sysmac studio的电机配置方法

使用歐姆龍NX控制器與Sysmac studio控制電機簡單運動 <上> — 環境配置0. 前言1. 實際硬件連接2. Sysmac studio 配置2.1 新建工程2.2 通信設置2.2.1 軟件內通信設置2.2.2 上位機本地通信設置 0. 前言 筆者最近需要使用到歐姆龍的多軸運動控制器來控制電機運動,但網路上關於Sysmac studio的教程或文章較為零散,作為初學者的筆者難以消化,故在稍微會用軟件後撰寫本文,為自己留個筆記,同時希望能夠幫助到需要的人。 1.本文面向買了歐姆龍控制器

weixin_46005653的博客 1万+

红黑树 修复

插入插入染红,其中叔父如下情况,祖父必黑。 []内表示为上层节点的那一侧。当插入造成不平衡情况 D为left为列 - 情况1:父红,叔红 - 情况2:父红[D] , 叔黑,新节点外侧[D] - 情况3:父红[D], 叔黑,新节点内测[!D]修复过程为1->2->3修复方式为 旋转 (与AVL tree LL,RR 单旋转一致) 变色 (即改变红黑) 修复

Ink_cherry的博客 1034

用Multisim和74192芯片复刻经典:手把手教你搭建篮球24秒违例计时器(附仿真文件)

本文详细介绍了如何使用Multisim仿真平台和74192芯片构建篮球24秒违例计时器,涵盖时序逻辑电路设计、核心器件选型、仿真环境搭建及调试技巧。通过分步指导,帮助读者掌握数字电路设计的关键技术,并附赠仿真文件供实践参考。

weixin_27014595的博客 278

【算法导论】红黑树详解之一(插入)

红黑树是建立在二叉查找树的基础之上的,关于二叉查找树可以参看【算法导论】二叉搜索树的插入和删除和【算法导论】二叉树的前中后序非递归遍历实现。对于高度为h的二叉查找树而言,它的SEARCH、INSERT、DELETE、MINIMUM、MAXIMUM等操作的时间复杂度均为O(h)。所以在二叉查找树的高度较高时,上述操作会比较费时,而红黑树就可以解决这种问题。

苦咖啡的自留地 1万+

【AI Agent系列】【MetaGPT】9. 一句话订阅专属信息 - 订阅智能体进阶,实现一个更通用的订阅智能体(2)

订阅智能体进阶(2)。不用爬虫,直接提取网页信息。从RunSubscription分离出AddSubscriptionTask的action,并且让SubscriptionRunner单独运行。

同学小张的博客 1587

GD32F130之USART多机通信

简介 在多机通信中,一个从机应该只接收它需要接收的数据,且只应该在它需要接收数据时才检测串口。而始终接收RX线上的数据对从机来说是一种负担。 多机通信硬件设计 远距离方案:RS485 板级方案: 静默模式 静默模式有什么作用? 答:如果 USART 处于静默模式,所有的接收状态标志位将不会被置位。 如何进入静默模式? 答:软件可以通过将 USART_CMD 寄存器中MMCMD 位置 1 使 USART 进入静默模式。 如何从静默模式中唤醒? 答:有两种方式可选,①检测到总线

luliplus的博客 299

【简易版tinySTL】 红黑树- 定义, 插入, 构建

对于一个平衡二叉搜索树,左子树高度为4,右子树高度为2,它们的高度差为2,破坏了平衡性(高度差<2才算平衡,因此需要调整二叉树使其平衡)当结点14右旋时,由于有右子树17,会和结点9冲突,阻碍旋转,我们需要将"冲突的右孩变左孩",即将结点9连在被旋转点14的左孩子上。当结点5左旋时,由于有左子树3,会和结点6冲突,阻碍旋转,我们需要将"冲突的左孩变右孩",即将结点6连在被旋转点5的右孩子上。假设我们要依次插入:17、18、23、34、27、15、9、6、8、5、25。

yzfzzz的博客 772

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。

Bit_Dong的博客 2926

Java之红黑树

1、简介 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是

qq_41720578的博客 5602

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

实现红黑树的插入方法

红黑树插入方法实现红黑树的简介红黑树的结构功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 红黑树的简介 红黑树(Red...

qq_43511948的博客 513

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java 红黑树_带你走进Java集合-HashMap源码-红黑树的那点事

因为工作忙的原因,有一段时间没有写文章了,来继续我们的Java源码之旅。上几篇文章我们主要介绍了HashMap的一些基础内容,也介绍了HashMap的底层数据结构:数组+链表+红黑树,数组、链表这两个数据结构非常的简单,我们就不着重介绍了,今天我们开始说一下红黑树。红黑树的5个特性必须牢牢地记得:特性1:每个节点要么是黑色的,要么是红色的,没有第三种颜色特性2:根节点一定是黑色的特性3:所有的叶子...

weixin_42397516的博客 128

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

红黑树详解

Table of Contents 1.定义 2.实践 2.1 红黑树操作 2.1.1 插入操作 红叔 2.2 红黑树实现 2.2.1 插入 2.2.2 删除节点 3.总结 架构师社区 https://mp.weixin.qq.com/s/ZOA8BX7terj3If_-TDb1Cg 作者:遇见技术 https://www.jianshu.com/p/4cd37000...

RToax 507

马程序员学习笔记——红黑树解析一

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

cdl的专栏 1012

Day_21,红黑树及常用相关函数的实现

假设有n个节点,普通二叉搜索树 O(h)可能存在 h=n的最坏情况;对于红黑树来说O(lgn),不受这种h=n的限制 这里设置为RED可以不破坏性质5 #include <stdio.h> #include <string.h> #include <iostream> using namespace std; enum NodeColor { RED = 1, BLACK = 2 }; template<class T> clas.

weixin_40301728的博客 336

Java基础汇总(十七)——红黑树

Java基础 红黑树

weixin_45864705的博客 966

红黑树的定义性质和插入删除

红黑树摘要 红黑树是一种自平衡二叉排序树,满足:1)节点非黑即红;2)根叶节点黑;3)无相邻红节点;4)任意路径黑节点数相同。其高度h≤2log₂(n+1),保证高效查找。插入时新节点默认红,通过旋转和变色调整(依据叔节点颜色);删除时需处理双黑节点问题,分兄弟节点红/黑情况调整。核心操作均围绕维护红黑树五大性质展开,确保动态操作后仍保持平衡。

mifengxing的博客 944

红黑树非详解

红黑树性质 1.每个节点要么是红色,要么是黑色 2.根节点必须是黑色 3.红色节点不能连续(父子不能同红) 4.每个叶结点(包括null节点)都是黑的 5.从任意节点出发,到其所有叶子节点的简单路径上都包含相同数目的黑色节点(重点) 浅谈: 1.插入节点:新插入节点是红色的(–性质2–若是根节点就变黑),再插一个就是双红(–性质3–此时需要旋转或变色)。 2.旋转:树的旋转本质是节点的指向发生变化,代码+画图思路就十分清晰 3.红黑树可视化:在线画红黑树,用来判断自己的程序是否正确 ps: 代码是我从gi

W2001r的博客 865

红黑树

介绍还有一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),1978年被Leonidas J. Guibas和Robert Sedgewick改成一个比較摩登的名字:红黑树。 红黑树和之前所讲的AVL树相似,都是在进行插入和删除操作时通过特定操作保持二叉查...

weixin_30249203的博客 92

红黑树(Red Black Tree)相关概念以及不同添加操作的详解

红黑树(Red Black Tree) 红黑树也是一种自平衡的二叉搜索树。 以前也叫做平衡二叉B树(Symmetric Binary B-tree) 红黑树必须满足以下 5 条性质 ①、节点是RED或者BLACK ②、根节点是BLACK ③、叶子节点(外部节点,空节点)都是 BLACK ④、RED节点的子节点都是BLACK ✓ RED节点的parent都是BLACK ✓ 从根节点到叶子节点的所有路径上不能有 2 个连续的RED节点 ⑤、从任一节点到叶子节点的所有路径都包含相同数目的BLACK节点

派拉斯兔子的博客 926

[Elementary-Algorithms/6]并不复杂的红黑树

ji

ALonWol的博客 314
上一篇: TCP、HTTP、socket的区别
下一篇: RF GBDT XGBOOST的区别与联系
朝阳在望
博客等级 码龄14年 41粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值