红黑树学习上篇

 如果你已经掌握了红黑树前篇的内容,那么很高兴你已经具备了学习红黑树的资本。左旋转和右旋转是红黑树中为了调节红黑个数而设计的方案,所以,此篇主要讲解一下旋转问题。旋转是红黑树中最简单的东东,不过也是最基础的,由于涉及到红黑树的性质,所以先从学习红黑树的五个性质开始吧。


1,红黑树的五个性质:
  1)每个结点要么是红的,要么是黑的。
  2)根结点是黑的。
  3)每个叶结点,即空结点(NIL)是黑的。
  4)如果一个结点是红的,那么它的俩个儿子都是黑的。
  5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

 

2,红黑树的旋转:
当我们在对红黑树进行插入、删除等操作时,对树做了修改,那么可能会违背红黑树的性质。
为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些结点的指针结构,同时需要更改某些节点的颜色,以达到对红黑树进行插入、删除结点等操作时,红黑树依然能保持它特有的性质。
旋转如下图:

其中:旋转过程中二叉搜索树(BST)性质不变:α≤x≤β≤y≤γ


我们以左旋为例进行解析,左旋如下图:

图中红线标注的步骤如下(right[x]:x的右节点;p[x]:x的父节点):
①y←right[x]        
②right[x]←left[y], p[left[y]]←x
③p[y]←p[x], p[x]的左或右指针指向y (p[x]为根节点则root←y)
④ Left[y]←x, p[x]←y 
经过此四个步骤即可完成左旋操作。     

     

3,代码实现:

//root:传入的树的根节点,x:旋转的基点。
Node* left_rotate( Node* root, Node* x )
{
	Node* y;

	//左旋结点必须有右子结点
	if( x->right == &tree_nil ) 
	{
	    printf( "have no right child,rotation cancel.\n" );
	    return root;
	}
	
	//Step1:记录y的位置,其为x的右节点 == y←right[x] 
	y = x->right;
	
	//Step2:y的原来的左节点变为x的右节点 == right[x]←left[y]
	x->right = y->left; 
	//y的原来的左节点的父节点变为x == p[left[y]]←x
	if( y->left != &tree_nil )
		y->left->parent = x;

	//Step3:原来的x的父结点变为现在的y的父结点 == p[y]←p[x]
	y->parent = x->parent; 
	if( x->parent == &tree_nil )
		root = y;
	else if( x == x->parent->left )
		x->parent->left = y;
	else
		x->parent->right = y;

	//Step4:x为y的左节点,y为x的父节点。
	y->left = x;
	x->parent = y;

	return root;
}

 

4,左旋+节点颜色修改:
为什么要旋转,最终的目的还是为了实现红黑树的五个性质,以下图为例解释说明左旋操作:

此图操作步骤为(主要对性质5进行说明,其余性质一目了然):祖、父两个节点互换颜色,最后对祖节点进行左旋转。颜色互换后旋转,是的为红色的祖节点成了左子树上的一点,左子树添加红节点不影响其黑节点个数。同时,对于右子树来说,父变成了根节点,但是父变为了黑色,其黑节点个数依然不变。其中1由右边改为了左边,但是他的父节点的颜色是一直的,且其现在的父节点和原来父节点是兄弟关系,古其黑节点个数也不变。

 

5,右旋和左旋类似,不做叙述。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
毕设新项目基于python3.7+django+sqlite开发的学生就业管理系统源码+使用说明(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 学生就业管理系统(前端) ## 项目开发环境 - IDE: vscode - node版本: v12.14.1 - npm版本: 6.13.4 - vue版本: @vue/cli 4.1.2 - 操作系统: UOS 20 ## 1.进入项目目录安装依赖 ``` npm install ``` ## 2.命令行执行进入UI界面进行项目管理 ``` vue ui ``` ## 3.编译发布包(请注意编译后存储路径) #### PS:需要将编译后的包复制到后端项目的根目录下并命名为'static' 学生就业管理系统(后端) ## 1.项目开发环境 - IDE: vscode - Django版本: 3.0.3 - Python版本: python3.7.3 - 数据库 : sqlite3(测试专用) - 操作系统 : UOS 20 ## 2.csdn下载本项目并生成/安装依赖 ``` pip freeze > requirements.txt pip install -r requirements.txt ``` ## 3.项目MySQL数据库链接错误 [点击查看解决方法](https://www.cnblogs.com/izbw/p/11279237.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值