一种新的删除红黑树节点的算法

红黑树的节点删除技巧:数据结构与算法 我们的目的是让大家彻底搞明白红黑树节点删除的技巧。范围涵盖红黑树的基本概念、节点删除的具体操作、相关的算法原理,以及在实际项目中的应用。通过学习,大家能够独立完成红黑树节点删除的代码实现,并理解其背后的逻辑。本文首先会介绍红黑树的核心概念,包括它与普通二叉树的区别和联系。接着详细讲解节点删除的算法原理和具体操作步骤,用代码示例展示如何实现。然后会给出数学模型和公式,帮助大家更深入地理解。再通过项目实战,让大家看到红黑树节点删除在实际中的应用。之后介绍红黑树的实际应用场景、相关工具和资源。 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/mxway/article/details/38080315

下面维基百科上红黑树的5个性质

1.      节点是红色或黑色

2.      根是黑色

3.      所有叶子都是黑色(叶子是NIL节点)

4.      每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)

5.      从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

根据上面的5个性质,我们可以得出下面的结论:

结论1:在红黑树中若x只有一棵非空子树,则x必为黑色。


证明:假设x为红色,根据性质4可以推出x有两个黑色子节点。与x只有一棵非空子树矛盾。

结论2:在红黑树中若x只有一棵非空子树。则该非空子树的根必为红色,且该非空子树仅且只有一个根节点。

证明:假设y为x的左孩子,节点y的颜色为黑色,且y有子树。由于y是黑色,x的右子权为空,所以从x到其左子树各叶子结点的路径上黑色结点数大于x到其右子树叶到叶节点的路径上黑色节点数,违反性质5,所以节点y为红色。因为y为红色,如果y的子树存在,根据性质4可以得出y的两棵子树必为黑色。从x到经过y到各叶节点的路径上的黑色节点数大于到右子树叶节点路径上的黑色节点数。

同上所述,当y为x的右孩子时也可以证明结论2


下面讨论红黑树的删除问题:

1. 从上面的两个结论可以看出,如果要删除的节点只有一个孩子,那么直接用孩子节点的值代替父节点的值。删除子节点就可以,不需要进入删除调整算法。

2. 若当前要删除的节点两个孩子都不为空,此时我们只需要找到当前节点中序序列的后继节点。用后继节点的值替换当前节点的值。将后继节点作为新的当前节点,此时的当前节点一定只有一个右孩子或左右孩子都为空。

3. 通过步骤2后如果当前节点有后继节点,直接用其后继节点值替换当前节点值,不需要进入删除调整算法。如果当前节点没有后继节点,进入删除调整算法。

算法流程步骤:

1.      判断x的左右子树是否为空。

2.      如果x的左右子都不为空,找到中序序列中x的后继节点y,将x的值用y代替;将y作为新的x节点转到步骤1。否则转步骤3

3.      如果x的左子不空,将x的值用左子的值代替,删除x的左子,算法结束。否则转4

如果x的右子不空,将x的值用右子的值代替。

4.      如果x的右子不空,将x的值用右子的值代替,删除x的右子,算法结束。否则转5

5.      删除x,进入到红黑树删除节点调整程序。

下面通过图来详解红黑树的删除过程

首先利用上篇文章中的代码生成一棵红黑树,插入的顺序为:14,9,41,39,47,20,15,22,7,3,28,24

                                                                           图1:红黑树

1.删除节点22,由于节点22只有一个孩子24,所以直接把22替换成24。根据上面的结论,不需要进行删除调整算法。

                                                                  图2:删除节点22

2.删除节点24,24的节点颜色为黑色,且其兄弟39节点也为黑色,39的两个孩子为空,也为黑,所以将39结点染红,父节点28作为新的当前节点。由于28是红色,所以将28染黑,算法结束。

                                                       图3:删除节点24后的红黑树

3.删除节点39,因为39为叶节点,颜色为红。直接删除,不需要作任何调整。

     

                                                                   图4:删除节点39后的红黑树

4.删除节点28,由于节点28是黑色,其兄弟节点47为黑,兄弟节点的两孩子也为黑。所以节点47染红。父节点41变当前节点


                                                     图5:删除节点28第一次调整

现在41为当前节点,由于41的兄弟节点14为黑,14的两个孩子也为黑。所以将14节点染红。父节点20也就是根节点为当前节点

                                                    图6:删除节点28第二次调整

此时20为当前节点,由于20是根节点调整算法结束,将28从红黑树中删除。

                                                             图7:删除节点28后的红黑树

至此红黑树的属性全部恢复

下面给出删除红黑树节点及调整的c++代码。关于红黑树删除调整算法可以看July的博客,他说的比较详细。这个代码是在上一篇 stl map底层之红黑树插入步骤详解与代码实现基础上增加的新功能

删除节点的c++程序。

template<typename T>
void RBTree<T>::DeleteValue(const T &v1)
{
	RBNode<T>		*p = NULL;
	RBNode<T>		*nextNode = NULL;
	Search(v1,p);
	if(p==NULL)
	{
		cout<<"删除的值不存在"<<endl;
		return;
	}
	if(p->left && p->right)
	{
		RBNode<T> *tempNode = p->right;
		while(tempNode)
		{//中序序列的后继节点
			nextNode = tempNode;
			tempNode = tempNode->left;
		}
		p->val = nextNode->val;
		p = nextNode;
	}
	if(p->left)
	{
		//直接用后继节点的值替换
		RBNode<T> *temp = p->left;
		p->val = temp->val;
		p->left = NULL;
		delete temp;
	}
	else if(p->right)
	{
		//直接用后继节点的值替换
		RBNode<T> *temp = p->right;
		p->val = temp->val;
		p->right = NULL;
		delete temp;
	}
	else
	{
		//左右子树都不存在,需要进入删除调整算法
		DeleteReblance(p);
		if(p==root)
		{
			root = NULL;
		}
		else if(p==p->parent->left)
		{//父节点的指针域需要修改
			p->parent->left = NULL;
		}
		else if(p==p->parent->right)
		{//父节点的指针域需要修改
			p->parent->right = NULL;
		}
		delete p;
	}
}

红黑树删除后调整算法:

template<typename T>
void RBTree<T>::DeleteReblance(RBNode<T> *node)
{
	RBNode<T> *parent = NULL;
	RBNode<T> *other = NULL;
	while(node->color==_rb_black_node && node->parent)
	{
		parent = node->parent;
		if(node == parent->left)
		{
			other = parent->right;
			if(other->color==_rb_red_node)
			{//情形1兄弟节点为红
				parent->color = _rb_red_node;
				other->color = _rb_black_node;
				_rbtree_rotate_left(parent);
				other = parent->right;
			}
			if( (other->left==NULL || other->left->color==_rb_black_node)
				&& (other->right==NULL || other->left->color==_rb_black_node))
			{//情形2兄弟为黑,且兄弟的两个孩子也为黑
				other->color=_rb_red_node;
				node = parent;
				continue;
			}
			if( other->right==NULL || other->right->color==_rb_black_node)
			{//情形3兄弟节点的右孩子为黑,左为红
				other->left->color=_rb_black_node;//此时左孩子一定存在且颜色为红,如果不满足就不会进入这个条件
				other->color = _rb_red_node;
				_rbtree_rotate_right(other);
				other = parent->right;
			}
			//情形4兄弟节点的右孩子为红
			other->right->color=_rb_black_node;
			other->color = parent->color;
			parent->color = _rb_black_node;
			_rbtree_rotate_left(parent);
			break;
		}
		else
		{
			other = parent->left;
			if(other->color==_rb_red_node)
			{//情形1兄弟节点为红
				parent->color = _rb_red_node;
				other->color = _rb_black_node;
				_rbtree_rotate_right(parent);
				other = parent->left;
			}
			if( (other->left==NULL || other->left->color==_rb_black_node)
				&& (other->right==NULL || other->left->color==_rb_black_node))
			{//情形2兄弟为黑,且兄弟的两个孩子也为黑
				other->color=_rb_red_node;
				node = parent;
				continue;
			}
			if( other->left==NULL || other->left->color==_rb_black_node)
			{//情形3兄弟节点的右孩子为黑,左为红
				other->right->color=_rb_black_node;//此时左孩子一定存在且颜色为红,如果不满足就不会进入这个条件
				other->color = _rb_red_node;
				_rbtree_rotate_left(other);
				other = parent->left;
			}
			//情形4兄弟节点的右孩子为红
			other->left->color=_rb_black_node;
			other->color = parent->color;
			parent->color = _rb_black_node;
			_rbtree_rotate_right(parent);
			break;
		}
	}
	node->color = _rb_black_node;
}



掌握红黑树的节点删除流程:数据结构与算法 红黑树的删除操作是其最复杂的部分(比插入难3倍以上!),但也是理解其“自平衡”机制的关键。红黑树的核心规则(5条“交通法规”)删除操作的3种基础场景(无子节点/1个子节点/2个子节点)删除后破坏规则的4类修复场景(基于兄弟节点的颜色和子节点颜色)用Python实现删除功能的完整代码示例用“交通信号灯”比喻理解红黑树的5条核心规则用“拆快递”场景拆解删除操作的3种基础情况用“修补篱笆”比喻讲解删除后4类修复场景的处理逻辑用Python代码实现完整的红黑树删除功能,并逐行解读红黑树。 阅读详情

相关推荐

解析红黑树的节点删除规则:数据结构与算法

红黑树作为一种自平衡的二叉搜索树,在计算机科学领域有着广泛的应用,如在操作系统的内存管理、数据库索引等方面。本文的目的是深入解析红黑树的节点删除规则,详细阐述其原理、算法实现以及实际应用。范围涵盖红黑树的基本概念、节点删除的具体操作步骤、数学模型分析、项目实战案例以及相关资源推荐等方面。本文将按照以下结构进行组织:首先介绍红黑树的核心概念与联系,包括其定义、性质和架构;接着详细讲解红黑树节点删除的核心算法原理和具体操作步骤,并给出Python源代码实现;

AI 算法实战派 934

【数据结构】红黑树的删除(抽丝剥茧,带你理清每一种情况)

红黑树的删除,举例+图解,庖丁解牛,逐步分析,最后总结+图解带你理清逻辑。

Shun_Hua的博客 3294

红黑树 删除调整步骤终极详解

       上一篇讲了插入调整,现在来讲删除调整。红黑树的删除无疑是最难的,抛开调整,红黑树的插入删除都跟选择二叉树一样,所以前面的步骤网上很多了,在这里只讲如何调整,以满足红黑树性质。        还是从头到尾理一下吧...        先定义一下,删除节点为d,真实删除节点为reald,顶替节点为x,x的兄弟节点即前reald的兄弟节点为w。        找到要删除的节点d。 ...

anliayx的博客 6665

第102篇 C++数据结构(十二)红黑树的删除

第102篇 C++数据结构(十二)红黑树的删除红黑树删除的结点孩子情况红黑树的删除代码实现红黑树删除被删除结点的情况红黑树删除的调整红黑树删除的代码实现红黑树删除总结 红黑树删除的结点孩子情况 红黑树的删除和普通的二叉搜索树的删除时一样的,都是存在三种情况: 1.删除的结点没有孩子,这时这个结点可以直接删除 2.删除的结点有一个孩子,则用孩子的数据来替换掉它的数据,像数组的删除用后面的数据把前面的数据覆盖掉一样,然后删除该结点 3.删除的结点有两个孩子,这种情况可以转成(1),(2)情况,就是找前驱结点或者

weixin_49188222的博客 1057

学习算法导论——红黑树旋转插入和删除

红黑树是一棵二叉搜索树,每个节点有一个标志位表示颜色,该颜色可以是红(RED)或黑(BLACK)。通过对任何一条从根到叶子的简单路径上各点的颜色进行约束,就能确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。 红黑树每个节点有5个属性,color,key,leftChild,rightChild,p。其中color是颜色,key是关键字,leftChild是指向左孩子的指针,rightC

小咸鱼_的博客 6168

理解红黑树的节点插入和删除

红黑树是计算机常用数据结构,在 Linux 内核进程调度,Nginx 定时器管理中均有使用 红黑树的查找时间为O(lgn),与Hash相比,其优势在于:节约存储空间,其数据具有连续性,可以查找一个范围的数据 红黑树的难点在于插入和删除,在很多算法书中,对其颜色调整讲得比较粗略,不易于理解,本文主要是按照作者的理解,对其插入和删除过程进行推导,演变方式与算法书中可能会有些差异,欢迎大家进行讨论

AlexWoo0501的博客 1433

数据结构-----红黑树的删除操作

只有流过血的手指,才能弹出世间的绝唱。—— 泰戈尔今天我们接着学习红黑树,前面学习了红黑树的插入操作,那这次就学习红黑树的删除操作,相较于红黑树的插入操作,红黑树的删除操作更加复杂,但是别急,下面我会非常详细的去讨论这个过程,以及提供完整的代码,好了,开始上正文。相关链接数据结构-----红黑树简介_Gretel Tade的博客-优快云博客数据结构-----红黑树的插入_Gretel Tade的博客-优快云博客),这个是一个红黑树模拟器的网址,你们可以去进行红黑树插入删除遍历等操作,可以自己试试看。

m0_73633088的博客 2705

红黑树的删除

《算法导论》红黑树删除调整只有四种情形

denghai_csdn的博客 1487

红黑树,插入和删除,基于C++的实现

接上篇红黑树,插入和删除,更好的理解 ,在这篇文章中,我不会过多介绍理解部分,因为上篇文章已经说的差不多了。接下来我将基于C++来实现红黑树,同样的,欢迎大家在评论区提出疑问和指出错误! 首先,我们需要构建红黑树的结点类,这个类里面,要有key值,value值,结点的颜色,还要有指向左右子结点的结点类指针,最后加上指向父结点的结点类指针。我这里,将key值设为int类型,value值设为string类型,结点的颜色用bool类型表示,也就是true表示红色,false表示黑...

weixin_52026625的博客 613

【算法基础】初步图解红黑树插入删除节点操作(纯新手向)

该文章是参考了https://baijiahao.baidu.com/s?id=1641940303518144126&wfr=spider&for=pc和https://www.cnblogs.com/skywang12345/p/3245399.html并自己画图进行编写的 什么是红黑树: 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科...

WEN_Windy的博客 1009

算法导论学习--红黑树详解之删除(含完整红黑树代码)

前面我们讨论了红黑树的插入的实现,基本思想是分类讨论;然后分情况讨论以后我们发现插入操作调整函数只需要处理三种情况,并不是太复杂。但是删除操作会更复杂一点,因为二叉搜索树的删除操作本身就分成了多种情况,这样在执行删除操作后要处理的情况会更多;下面对于删除操作我们仍旧采取分类讨论的方法,将所有的情况梳理清楚后,就可以理解红黑树的删除调整函数的实质了。 下面先放出红黑树删除函数的代码://红黑树删除函

荒野孤鹰 6782

用c++实现红黑树的判断、插入、遍历操作

红黑树        红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。 红黑树是满足下面红黑性质的二叉搜索树: 1. 每个节点,不是红色就是黑色的; 2. 根节点是黑色的; 3. 如果一个节点是红色的,则它的两个子节点是黑色的;

岩枭的博客 5015

不只是CPU主频:深入解析英飞凌Aurix TC3xx各外设时钟树(CAN、以太网、Flash时序如何配置)

本文深入解析英飞凌Aurix TC3xx系列微控制器的外设时钟树配置,涵盖CAN、以太网和Flash时序的优化方法。通过详细分析时钟系统架构、关键外设配置及多外设协同设计策略,帮助工程师实现高性能汽车电子控制单元(ECU)开发。特别关注系统时钟的灵活配置与EMC优化技巧,提升系统实时性和可靠性。

weixin_29189373的博客 401

红黑树(删除)

得到

spch2008的专栏 2万+

R语言笔记十:独立性检验函数

1.独立性检验函数        独立性检验是根据频数信息判断两类因子彼此相关或相互独立的假设检验。所谓独立性就是指变量之间是独立的,没有关系。 独立性检验算法:卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 2.假设检验 假设检验(Hypothesis Testing)是数理统计学中根据一定假设条件由样本推断总体的一种方法。 原假设——没有发生 备择假设——发生了 具体做法:根据问题的需要对所研究的总体作

weixin_44384631的博客 4111

描边盛开火玫瑰

python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr

weixin_50973371的博客 2066

红黑树之删除节点

链接:https://www.cnblogs.com/qingergege/p/7351659.html 上一篇文章中讲了如何向红黑树中添加节点,也顺便创建了一棵红黑树。今天写写怎样从红黑树中删除节点。 相比于添加节点,删除节点要复杂的多。不过我们慢慢梳理,还是能够弄明白的。 回顾一下红黑树的性质 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何...

WitsMakeMen的专栏 609

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 464

算法导论 之 红黑树 - 删除[C语言]

作者:邹祁峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.youkuaiyun.com/qifengzou 日期:2014.01.18 01:21 转载请注明来自"祁峰"的优快云博客 1 引言 在《算法导论 之 红黑树 - 插入》中已经对红黑树的5个性质做了较详细的分析,同时也给出了insert操作的C语言实现。首先我们...

做事先做人! 4607

威联通改装飞牛fnOS全攻略:从刷机到Docker影视部署

NAS系统是家庭数字存储的核心,x86架构的威联通设备凭借通用引导和驱动支持,成为改装替代系统的理想平台。飞牛fnOS作为基于Debian的国产NAS系统,以简洁UI、内置Docker和影视墙以及硬件转码能力,吸引了大量玩家。通过U盘引导安装、BIOS调整、系统盘SSD部署,可实现系统切换;原机械硬盘可挂载为存储池,配合Docker部署下载、远程访问等容器,影视中心自动削刮海报墙,硬件转码保障4K播放。改装过程需注意引导失败、硬盘识别、核显驱动等问题。这套方案能让老旧威联通焕发新生,兼顾易用性与扩展性。本文

weixin_33585822的博客 774

3DE重客户端安装

3DE重客户端安装

m0_48170265的博客 9435

【算法】红黑树删除数据(最后一步,平衡红黑树)(五)

老话说一说,本人菜鸡,如果文章中有错误请大家批评指出!!! 该系列已经全部更完,有5篇文章: 【算法】红黑树(二叉树)概念与查询(一):https://blog.youkuaiyun.com/lsr40/article/details/85230703 【算法】红黑树插入数据(变色,左旋、右旋)(二):https://blog.youkuaiyun.com/lsr40/article/details/8...

lsr40的博客 2113

RTA_OS基础功能讲解 2.6-资源锁和自旋锁

访问需要在任务和 ISR 之间共享的硬件或数据可能不可靠、不安全。这是因为当优先级较低的任务或 ISR 正在更新共享数据时,可能会发生任务或 ISR 抢占。这种情况被称为竞争条件,极难测试。访问共享数据的语句序列称为关键部分。要安全访问关键部分中引用的代码和数据,就需要执行互斥。换句话说,必须确保系统中没有其他任务或第 2 类 ISR 能够在关键部分期间抢占正在执行的任务。你可以将任务声明为非抢占式任务,这样就可以避免互斥问题。

本博客专注于嵌入式软件领域技术分享。 291

关于红黑树删除节点操作的完整推导

本文系统分析了红黑树的删除操作。作者首先回顾了二叉查找树的删除规则,重点讨论了红黑树删除黑色节点时导致子树黑高变化的处理策略。通过分类讨论父节点和兄弟节点的颜色组合,详细推导了各种情况下的调整方法,包括旋转操作和颜色变换。特别指出最复杂的情况需要向上迭代调整,但整体时间复杂度仍保持O(logn)。分析表明,每次删除最多进行三次旋转操作。文章为理解红黑树删除操作提供了清晰的逻辑框架和技术细节。

crosnken的博客 1012

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【数据结构与算法】红黑树的插入与删除详解

​ 我们这里只实现红黑树的插入和删除,了解他们的底层即可,而后面我们在介绍map以及set的模拟实现的时候,我们就会进一步将红黑树进行改造!enum ColorBLACK,RED, _kv(kv){}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的键值对Color _col;// 节点的颜色​ 后面我们在实现map和set的时候,我们会对节点定义进行一些改变,这些具体后面会讲!

lirendada的博客 1643

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: stl map底层之红黑树插入步骤详解与代码实现
下一篇: 飞鸽传书源码分析-程序启动过程
mxway
博客等级 码龄17年 370粉丝 66原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值