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

小卢带你学算法之红黑树的删除与插入操作 二叉树之红黑树红黑树的特性一、红黑树的插入操作1、 黑父2、 红父三、红黑树的删除删除节点存在三种可能删除节点的方法1、要删除节点为红色(自己为红)2、要删除节点为黑色(自己为黑)总结 红黑树的特性 每个节点或者是黑色,或者是红色 根节点是黑色 每个叶子节点(NIL)是黑色[这里的叶子节点,是指空(NIL或null)的叶子节点] 如果一个节点是红色,则它的子节点必须是黑色的 从一个节点到该节点的所有子孙节点的所有路径上的黑色节点数目相同。 一、红黑树的插入操作 由于黑红数的黑色节点更多,为了能够减少冲 阅读详情

红黑树概念请戳:点击打开链接-http://www.sohu.com/a/201923614_466939

红黑树代码请戳:点击打开链接-https://www.cnblogs.com/skywang12345/p/3624343.html

-------------------------------------------------------------------------------------------------

感觉他写的代码注释不是很详细,而且没有配图说明,有些看着很晕

所以这里对于<天王的博客>中红黑树插入修正和删除修正的代码这块进行详解

-------------------------------------------------------------------------------------------------

(1) 每个节点或者是黑色,或者是红色。
(2) 根节点是黑色。
(3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
(4) 如果一个节点是红色的,则它的子节点必须是黑色的。

(5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

---------------------红黑树:5大规则---------------------------------------------------------------------

首先,进行插入修正这块进行详解:


不需要调整的情况:


需要调整的情况:(因为插入节点是 红色节点 ,所以需要调整的都是违反 规则4 的)

GP-grandparent-祖父节点

P-parent-父节点

U-uncle-树节点

node-插入节点





-----------------------------------------------------------------------------------------------------

首先:对于case 1,进行调整分析




Case 1 达到平衡.............................................

--------------------------------------------------------------------------------------------------------------------------------

Case 2 分析:



这里处理方式是,将Case 2 转成 Case 3 然后一起处理!!!---------------------然后达到平衡

----------------------------------------------------------------------------------------------------------------------------------

Case 3 分析:



--------------------------------------------------------------------------------------------------------------------------------

Case 4 分析:




----------------------------------------------------------------------------------------------------------------------------------

Case 5 分析:



解决方式,就是将Case  5 转成 Case 6 然后一起解决.......................

---------------------------------------------------------------------------------------------------------------------------------

Case 6 分析:



--------------------------------------------------------------------------------------------------------------------------------

以上就是 插入的6种需要调整的情况,以及如何决定,和代码分析,极其详解

我的代码---用的<点击打开链接>这个大神的写的,然后根据自己想法写的,稍稍有点不一样,但大致是一样的

public void insertFixUp(RBNode<T> node) {
        RBNode<T> parent, gparent;

        while ((parent = node.parent) != null && parent.color == RED) {// 判断 是否 有父节点并且父节点为红色
            gparent = parent.parent;

            // * 插入节点前,该树是红黑树
            // * -父节点存在,且父节点为红色,那么父节点不是根节点(规则:根节点为黑色)
            // * -所以一定有祖父节点,且祖父节点为黑色(规则:父子节点不能同时为红色)
            // * -所以叔叔节点要么为黑色空节点,要么为红色节点(规则:从任意节点,到叶子节点上的黑色节点数相同(叶子节点指黑空节点))
            if (parent == gparent.leftChild) {
                /*
                 * 父节点是祖父节点的左孩子 叔叔节点是祖父节点的右孩子
                 */
                RBNode<T> uncle = gparent.rightChild;
                /*
                 * case 1:叔叔节点存在且为红色节点
                 */
                if (uncle != null && uncle.color == RED) {
                    uncle.color = BLACK; // 叔叔节点颜色调整为黑色
                    parent.color = BLACK;// 父节点颜色调整为黑色
                    gparent.color = RED;// 将祖父节点颜色调整为红色
                    node = gparent;// 在将祖父节点代入,判断祖父节点和祖父节点的父节点是否冲突
                    continue;// 继续循环
                }

                /*
                 * case 2:叔叔节点是黑空节点,且当前节点是父节点的右孩子
                 */
                if (parent.rightChild == node) {
                    leftRotate(parent); // 将父节点 左旋,当前节点 移动到父节点的位置,父节点移动到,当前节点的左孩子位置
                    RBNode<T> temp = parent;
                    parent = node;// 父节点 与 当前节点交换位置
                    node = temp;
                }

                /*
                 * case 3:叔叔节点是黑空节点,且当前节点是左孩子
                 */
                parent.color = BLACK;// 将父节点置为黑色
                gparent.color = RED;// 将祖父节点置为红色
                rightRotate(gparent);// 右旋祖父节点,达到平衡
            } else {

                // * 插入节点前,该树是红黑树
                // * -父节点存在,且父节点为红色,那么父节点不是根节点(规则:根节点为黑色)
                // * -所以一定有祖父节点,且祖父节点为黑色(规则:父子节点不能同时为红色)
                // * -所以叔叔节点要么为黑色空节点,要么为红色节点(规则:从任意节点,到叶子节点上的黑色节点数相同(叶子节点指黑空节点))

                // 父节点是祖父节点的右孩子
                RBNode<T> uncle = gparent.leftChild;

                /*
                 * case 4:叔叔节点存在且为红色节点
                 */
                if (uncle != null && uncle.color == RED) {
                    uncle.color = BLACK;
                    parent.color = BLACK;
                    gparent.color = RED;
                    node = gparent;
                    continue;
                }

                /*
                 * case 5:叔叔节点为黑色空节点,且当前节点为左孩子
                 */
                if (parent.leftChild == node) {
                    rightRotate(parent);
                    RBNode<T> temp = parent;
                    parent = node;// 父节点 与 当前节点交换位置
                    node = temp;
                }
                /*
                 * case 6:叔叔节点为黑色空节点,且当前节点为右孩子
                 */
                parent.color = BLACK;
                gparent.color = RED;
                leftRotate(gparent);
            }
        }

        root.color = BLACK;// 将根节点设置为黑色
    }

----------------------------------------------------------------------------------------------------------------------------------

插入修正画图就花了我一上午的时间弄的,自己用画图软件,一点一点画的.......贼辛苦

-----------------------------------------------------------------------------------------------------------------------------

接下来就是删除修正,这个是最麻烦的,光是理解代码意思,就花了我2天时间,画图就花了整整一个下午啊!!!!!

---而且还发现了代码的一处小瑕疵,还没验证对不对,但从图上理解,可以更简化点滴~

首先,朋友!删除节点,替代节点,了解一下........


-----------------------我这只是对修正进行了详解,如何删除,大家去看大神的代码,很详细了!!!


-------首先,我们调整结构时,需要用递归的思想去设计,就是先将冲突点的小部分结构调整过来,然后再定位到冲突点,再调整....

-------直至最后没有冲突为止(再调整冲突过程中,[规则5],和调整前要保持一致,这样就不需要,再为了黑色节点数目,去改变了!)


-----------------------------------------------------------------------------------------------------------------------------

就分为两大种情况了:

1.当node节点为红色时




代码:

so Easy........

----------------------------------------------------------------------------------------------------------------------------------

第二大种:

就是当node节点为黑空节点时:

Case 1 分析:





这种处理,就是Case 1 转成 Case 2 或 Case 3,4,5,然后一起处理.........


最后再将node节点置为黑色!!!

----------------------------------------------------------------------------------------------------------------------------------

Case 2 分析:




Case 2,就是将兄弟节点,置为红色,就解决了,然后在将node节点,置为parent节点,然后,再进行循环判断,是否冲突,如果不冲突就跳出循环

---------------------------------------------------------------------------------------------------------------------------------

Case 3分析:



----这个节点颜色,和一开始就没啥区别呀.....而且要变成黑色,也可以到最后变成兄弟节点右孩子时,再置黑一样的.....

----大家可以看看,先将兄弟节点置红,然后右旋,再将兄弟节点置为父节点的右孩子,然后再将兄弟节点的右孩子置黑

----感觉可以不置红,直接后面兄弟节点的右孩子置黑,就行了,所以这步应该可以省略的.....


---------------------------------------------------------------------------------------------------------------------------------

Case 4 分析:




----------------------------------------------------------------------------------------------------------------------------------

Case 5 分析:




可以看到 Case 4 和 Case 5,在操作上基本没啥区别,就是兄弟节点的右孩子为红色时,左孩子不管是红还是黑都没影响

----------------------------------------------------------------------------------------------------------------------------------


下半部分代码,基本就是上面分析的情况,将兄弟节点 和 node节点 对调过来,再分析就行了

----------------------------------------------------------------------------------------------------------------------------------

代码也是---我自己加了点注释,基本一样,就是中间,有句代码,有点多余,但不影响

    // node待修正的节点
    public void removeFixUp(RBNode<T> node, RBNode<T> parent) {
        RBNode<T> other;

        // 1.node = null 不是 root节点 进入循环
        // 2.node != null,node.color = black,不是 root节点 进入循环
        while ((node == null || node.color == BLACK) && node != root) {
            // 待修正节点 为 父节点的 左孩子节点
            if (parent.leftChild == node) {
                other = parent.rightChild;
                // 父节点 的 右子节点
                if (other.color == RED) {
                    // case 1: node 的 兄弟节点 是红色
                    other.color = BLACK;
                    parent.color = RED;
                    leftRotate(parent);
                    other = parent.rightChild;
                }

                if ((other.leftChild == null || other.leftChild.color == BLACK)
                        && (other.rightChild == null || other.rightChild.color == BLACK)) {

                    // Case 2 :1.兄弟节点 左孩子为空 并且 右孩子为空,2.兄弟节点 左孩子为黑色 并且 右孩子为黑色
                    other.color = RED;
                    node = parent;
                    parent = node.parent;
                } else {

                    if (other.rightChild == null || other.rightChild.color == BLACK) {
                        // Case 3 :兄弟节点,右孩子为空或为黑色
                        other.leftChild.color = BLACK;
                        other.color = RED;//这步可省略
                        rightRotate(other);
                        other = parent.rightChild;
                    }

                    // Case 4 :兄弟节点,右孩子为红色,左孩子为黑色
                    // Case 5 :兄弟节点,右孩子为红色,左孩子为红色
                    other.color = parent.color;
                    parent.color = BLACK;
                    other.rightChild.color = BLACK;
                    leftRotate(parent);
                    node = this.root;
                    break;
                }
            } else {

                other = parent.leftChild;
                if (other.color == RED) {
                    // Case 1: 兄弟节点为红色
                    other.color = BLACK;
                    parent.color = RED;
                    rightRotate(parent);
                    other = parent.leftChild;
                }

                if ((other.leftChild == null || other.leftChild.color == BLACK)
                        && (other.rightChild == null || other.rightChild.color == BLACK)) {

                    // Case 2:兄弟节点是黑色,且两孩子也是黑色
                    other.color = RED;
                    node = parent;
                    parent = node.parent;
                } else {
                    if (other.leftChild == null || other.leftChild.color == BLACK) {
                        // Case 3:兄弟节点是黑色,且左孩子是红色,右孩子为黑色
                        other.rightChild.color = BLACK;
                        other.color = RED;
                        leftRotate(other);
                        other = parent.leftChild;
                    }

                    // case 4:兄弟节点是黑色,兄弟节点的右孩子是红色,左孩子任意
                    other.color = parent.color;
                    parent.color = BLACK;
                    other.leftChild.color = BLACK;
                    rightRotate(parent);
                    node = this.root;
                    break;
                }
            }

        }

        if (node != null) {
            node.color = BLACK;
        }
    }

----------------------------------------------------------------------------------------------------------------------------------

以上基本就是,红黑树,最经典的插入修正和删除修正的图,以及代码分析!!!

感叹一句,发明红黑树5条规则的人,真TN是个人才!!!!!

----------------------------------------------------------------------------------------------------------------------------------

理解代码到画图基本花了3-4天时间........佩服我自己!!!!

深入理解红黑树与跳转表的高级数据结构 本文深入探讨了高级搜索树中的红黑树及其双黑修正算法和kd-树,以及词典结构中的跳转表。通过对红黑树的双黑修正过程的详细分析,以及对kd-树在多维范围查询中的应用,我们了解了这些数据结构在维持树平衡方面的巧妙设计。此外,还探讨了跳转表的结构和实现,展示了它如何提供快速的查找、插入和删除操作。文章通过实际案例和代码示例,加深了对这些高级数据结构的理解。 阅读详情

相关推荐

Mem0 vs LangMem vs Letta:三大AI记忆框架实战对比(附代码示例)

本文深入对比了Mem0、LangMem和Letta三大AI记忆框架的核心特性与适用场景。Mem0提供开箱即用的记忆管理服务,适合快速集成;LangMem深度融入LangGraph生态,适合复杂工作流;Letta则采用虚拟内存系统,旨在突破上下文窗口限制。文章通过实战代码示例,为开发者选择适合其业务需求的AI记忆解决方案提供了清晰指南。

g9h0i1的博客 679

红黑树及其插入修复方法

ALL about 红黑树

timcompp的博客 1357

LabVIEW多设备采集实战:1个程序同时控制3个RS485 Modbus仪表

本文详细介绍了如何使用LabVIEW实现多设备RS485 Modbus同步采集,涵盖硬件架构设计、多线程通信框架搭建、数据帧解析技巧及性能优化策略。通过实际项目案例,展示如何解决端口冲突、数据解析错误等工业自动化常见问题,提升采集系统实时性与可靠性。

qsc901234的博客 301

红黑树总结

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

qq_33513600的博客 253

基于AT32F421的紧凑型FOC电机驱动板设计

磁场定向控制(FOC)是永磁同步电机(PMSM)与无刷直流电机(BLDC)实现高精度转矩控制和高效运行的核心技术,其本质是通过Clarke/Park坐标变换解耦定子电流,实现d轴磁链与q轴转矩的独立调节。该技术依赖实时性严苛的电流采样、高精度位置反馈及确定性PWM生成,广泛应用于机器人关节、智能装备等中小功率伺服场景。国产Cortex-M4微控制器(如AT32F421)凭借集成ADC、高级定时器与DSP指令集,已成为低成本、高可靠FOC嵌入式实现的理想平台。本文围绕一款工程化FOC驱动板展开,涵盖低侧电流采

weixin_42510243的博客 702

Ubuntu 22.04下Colmap带CUDA支持的编译安装全攻略(附显卡架构查询指南)

本文详细指导在Ubuntu 22.04系统上从源码编译安装支持CUDA加速的Colmap,解决了官方版本无GPU支持导致处理速度慢的问题。重点包括环境依赖准备、CUDA工具链配置、显卡计算能力查询以及完整的编译安装步骤,旨在帮助研究者和开发者高效部署高性能三维重建工具。

gold8的专栏 344

红黑树的原理分析与(C++)实现: 模板类、插入算法双红修正、删除算法双黑修正 (C++)

红黑树 1.概述 定义 由红、黑两色节点组成的二叉搜索树若满足以下条件,即为红黑树 (red-black tree):    (1) 树根始终为黑色    (2) 外部节点均为黑色    (3) 其余节点若为红色,则其孩子节点必为黑色    (4) 从任一外部节点到根节点的沿途,黑节点的数目相等   从以上条件可得:红节点均为内部节点,且其父节点及左、右孩子必然存在。红节点之父必为黑色...

amoscykl的博客 1952

《干货满满!AI 应用架构师打造 AI 驱动生产计划的实战技巧》

生产计划是制造企业的“大脑”——它决定了买什么物料、产多少产品、用什么设备、什么时候交货,直接影响企业的成本、效率和客户满意度。需求预测靠经验,误差常超20%;排产依赖Excel,调整一次要3天;供应链协同靠邮件,物料延迟导致停产屡见不鲜。作为AI应用架构师,我们的任务是用AI重新“激活”这个“大脑”——用数据驱动的预测替代经验判断,用智能优化替代人工排产,用实时协同替代被动响应。本文结合3个制造业实战案例5段可运行代码2个数字孪生模型,从架构设计→核心模块实现→落地踩坑。

移动开发前沿的博客 1083

红黑树的删除

在之前我们已经学习了红黑树的插入插入操作, 现在我们来学习删除操作, 删除操作比起插入操作更复杂。

MindbniM的博客 1259

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 678

红黑树概述

c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。分析:p必须变⿊,才能解决,连续红⾊结点的问题,u不存在或者是⿊⾊的,这⾥单纯的变⾊⽆法解决问题,需要旋转 + 变⾊。

2401_87287423的博客 973

从零开始学习CANoe(十六)—— Graphics

Graphics是一种以时间轴为横坐标,符号值为纵坐标的显示分析方法,相对于Trace来说,更直观的观察出信号的跳变

蚂蚁小兵 9191

手撕红黑树:C++实现200行核心代码

首先定义节点结构,存储键值对、颜色标记、左/右子节点和父节点指针。使用NIL哨兵节点简化叶节点处理。

q_438141的博客 173

jdk8 for mac

jdk8 for mac

(2024年更新)中国养老机构、床位明细数据(完整数据)

## 数据指标说明中国养老机构是指为老年人提供集中居住、生活照顾、健康管理、文化娱乐等综合性服务的设施。这些机构包括养老院、福利院、老年公寓等多种形态,既有公立也有民办,遍布城市与农村本次分享的数据为5万多条中国养老机构明细数据,来自部。希望对大家有用## 一、数据介绍数据名称:中国养老机构数据明细数据范围:全国养老机构样本数量:58355条数据更新:2024年数据来源:中国民政部## 二、主要指标

Java 数据结构和算法(十一):红黑树

Java数据结构和算法(十一)——红黑树   上一篇博客我们介绍了二叉搜索树,二叉搜索树对于某个节点而言,其左子树的节点关键值都小于该节点关键值,右子树的所有节点关键值都大于该节点关键值。二叉搜索树作为一种数据结构,其查找、插入和删除操作的时间复杂度都为O(logn),底数为2。但是我们说这个时间复杂度是在平衡的二叉搜索树上体现的,也就是如果插入的数据是随机的,则效率很高,但是如果插入的数据是有序的,比如从小到大的顺序【10,20,30,40,50】插入到二叉搜索树中:      从大到小就.

dd2016124的博客 259

参考资料-基于Freescale单片机的电池管理系统设计.zip

参考资料-基于Freescale单片机的电池管理系统设计.zip

C++实现红黑树

C++实现红黑树,插入和删除思路

hdsHDS6的博客 1945

Mega-Fires v3.52

A complete Mesh deformation, animation and Morphing system including over 50 modifiers such as Bend, Twist, FFD, Displace, Taper. They can be stacked in any combination and any number of modifiers can be applied to a mesh to achieve complex results. Objects can stretch, squash, morph or be bent over of deformed, whatever your imagination allows. The morph system is the most advanced available for Unity. Recent additions to the suite include Point Cache animation support, a physics based rope system and a dynamic water ripple and floating object system. MegaFiers is written in C# and all source code is included, also it makes use of multiple CPU’s for amazing performance and works on all platforms and with the Free version of Unity. Compatible with all versions of Unity from 3.4 to 2019 and works on IOS and Android and all other Unity platforms. MegaFiers also is fully compatible with all Unity Rendering pipelines. We also constantly update the asset for all new releases of Unity.Also included is an advanced spline system which also allows for path following or conversion of splines to meshes, a dynamic hose system and a system for tracked vehicles, and an advanced mesh wrapping system for applying clothing etc. to deforming objects.Also available on our Website is a set of PlayMaker actions which includes actions for over 50 modifiers and warps.Compatible with all Rendering PipelinesCompatible with all versions of UnityNew Feature – Now works with Text Mesh Pro meshes.New Feature – Import OBJ sequencesIncluded Modifiers– Attractor Bezier– Bend– Bubble– Bulge– Collision Deform– Conform– Conform Multi– Crumple– Curve Deform– Curve Sculpt– Curve Sculpt Layers– Cylindrify– Deformable– Displace– Displace Limits– Displace RT– Displace WebCam– Dynamic Ripple– FFD 2x2x2– FFD 3x3x3– FFD 4x4x4– Globe– HIt Deform– Hump– Melt– Morph– Noise– Page Flip– Paint– Path Deform– Pivot Adjust– Point Cache– Push– Radial Skew– Relax– Ripple–

算法之路,带你轻松学废算法系列之红黑树

文章目录引入1、红-黑树的特征2、红-黑树的自我修正①、改变节点颜色②、右旋③、左旋4、插入操作5、删除操作完整代码实现运行截图 本博文大部分为原作者知乎张晓康所写,因为写的确实很nice,还请大家多多支持原创哦。原文链接为:https://zhuanlan.zhihu.com/p/37470948 红黑树可视化网页:http://www.u396.com/wp-content/collection/data-structure-visualizations/RedBlack.html 引入 二叉搜索树

阿拉修 697

漫画:什么是红黑树?(整合版)

前段时间,小灰发布了红黑树相关的文章,分成上下篇来讲解。这一次,小灰把两篇文章做了整合,并且修正了红黑树删除部分的图片错误,感谢大家的指正。————— 第二天 ———————————...

程序员小灰的博客 3万+

红黑树的旋转、插入和删除

前言 由于学习网络编程时间不长,各个网络编程函数,不是很熟悉,也记得不够精确。每次都查半天,经常烦恼于此。索性把它们都记录下来,便于自己记忆以及日后查阅、回顾。 主要介绍:socket、bind、listen、connect、accept、send、sendto、recv、recvfrom、close、shutdown。 提示:以下是本篇文章正文内容,下面案例可供参考 一、socket函数 在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来...

xfy333的专栏 498

深入浅出 红黑树:如何手写红黑树(基于TreeMap,算法导论的实现)

本文深入浅出了红黑树,包括双红和双黑的处理,讨论如何手写红黑树。 红黑树是一种高效的自平衡二叉搜索树,通过颜色标记和旋转操作维持平衡。TreeMap基于红黑树实现,其核心是Entry节点类,包含键值、指针和颜色属性。插入和删除操作通过fixAfterInsertion和fixAfterDeletion方法维护红黑树性质。插入时处理"红红冲突",删除时处理"黑高不平衡",涉及四种情况的旋转和变色策略。这些操作确保红黑树始终保持对数时间复杂度(O(log n))的查询、插入和删除性能。

lifallen的博客 2750

红黑树删除之向上调整

从图来看,向上调整了一层,2的父结点4也做了调整。

denghai_csdn的博客 1519

红黑树删除修正说明

红黑树删除的步骤: 找到要删除的节点 删除节点 判断是否需要修正 红黑树的定义: 根节点是黑色的 每个节点要么是黑色的要么是红色的 不能出现同时为红色的父子节点 每个节点到它的叶子节点的所有路径上所经过的黑色节点的数量必须要保持一致 仔细想一下,如果删除了一个节点,最有可能打破的是条件1、3、4。因为:1.如果删除的是根节点,而根节点的孩子节点有可能是红色的,删除根节...

maoxiaohai123的博客 473

红黑树的特性和实现

平衡二叉搜索树的形式多样,且各具特色。比如,伸展树实现简便、无需修改节点 结构、分摊复杂度低,但可惜最坏情况下的单次操作需要n时间,故难以适用于对可靠性和稳定性要求极高的场合。 反之,AVL树尽管可以保证最坏情况下的单次操作速度,但需在节点中嵌入平衡因子等标识;更重要的是,删除操作之后的重平衡可能需做多达logn次旋转,从而频繁地导致全树整体拓扑结构的大幅度变化。 红黑树即是针对后一不足的改进...

不能说的秘密的博客 8804

红黑树删除——C语言

 红黑树的删除——C语言 昨天理解了红黑树的定义、插入,旋转(左旋右旋)及相关代码实现,今天继续红黑树的删除。 可以先进行总结的是:红黑树的删除也是分两步走——第一步:像一个普通二叉查找树一样删除结点;第二步:对删除后的树进行修正。具体操作如下: 1、第一步:像一个普通二叉查找树一样删除结点并根据被删除结点的颜色决定下一步该怎么做。                     //(二叉查找树...

狒狒不会编程 1568

【note】红黑树的插入与删除

参考:算法导论 插入 利用二叉搜索树的性质,二分到合适的位置,插入一个红色的叶节点(设为 z)。 插入修正(双红修正) 如果 z.p 也是红色,那么将违反第 4 条性质(红节点的子节点是黑节点),需要进行修正,过程如下: Case 1:叔节点(y)为红色 将问题上传至 z.p.p Case 2:叔节点(y)为黑色,z ,z.p ,z.p.p 不共线 归约到 Case 3 Case 3:叔节点(y)为黑色,z ,z.p ,z.p.p 共线 删除 第 13 行是多余的 若 z 的左右子节点均非

qq_47903865的博客 515
下一篇: 如何排查CPU占用过高以及常见的几种情况
CoderPOPO
博客等级 码龄9年 11粉丝 19原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值