红黑树学习中篇
来源:互联网 发布:快递单打印软件 编辑:程序博客网 时间:2024/04/29 07:05
本篇讲述红黑树的插入,学完前面的两篇,就拥有了二成功力,学完此篇则拥有五成功力,开始吧。。。
疑问:为什么插入的节点是红节点?
答:红黑树的节点插入默认是节点为红色的,插入黑点会增加路径上黑点的数目,一定会破坏性质5;插入红点,当其父节点为黑色时,不影响平衡,继续保持红黑性质,当其父节点为红色时,可能破坏性质2(根节点是黑色的)、性质4(红色节点的子节点一定是黑色节点),需要进行修正。但是,对于一般红黑树来说,黑父的情况概率最大。
另外说明下,本文内容大部分来自:http://blog.csdn.net/haidao2009/article/details/8077514
下边各种情况以父节点、叔节点的形式展开:
1、黑父
如下图所示,如果新节点的父结点为黑色结点,那么插入一个红点将不会影响红黑树的平衡,此时插入操作完成。红黑树比AVL树优秀的地方之一在于黑父的情况比较常见,从而使红黑树需要旋转的几率相对AVL树来说会少一些。
2、红父
如果新节点的父结点为红色,这时就需要进行一系列操作以保证整棵树红黑性质。如下图所示,由于父结点为红色,此时可以判定,祖父结点必定为黑色。这时需要根据叔父结点的颜色来决定做什么样的操作。青色结点表示颜色未知。由于有可能需要根结点到新点的路径上进行多次旋转操作,而每次进行不平衡判断的起始点(我们可将其视为新点)都不一样。所以我们在此使用一个蓝色箭头指向这个起始点,并称之为判定点。
2.1 红叔
当叔父结点为红色时,如下图所示,无需进行旋转操作,只要将父和叔结点变为黑色,将祖父结点变为红色即可。但由于祖父结点的父结点有可能为红色,从而违反红黑树性质。此时必须将祖父结点作为新的判定点继续向上(迭代)进行平衡操作。(注意这里是需要迭代的,有可能会调整到根节点)
需要注意的是,无论“父节点”在“叔节点”的左边还是右边,无论“新节点”是“父节点”的左孩子还是右孩子,它们的操作都是完全一样的(其实这种情况包括4种,只需调整颜色,不需要旋转树形)。
2.2 黑叔
当叔父结点为黑色时,需要进行旋转,以下图示了所有的旋转可能:(case1 和caes 2 都是把左边较大的节点调整到上面去)
Case 1:
Case 2:
Case 3:
Case 4:
可以观察到,当旋转完成后,新的旋转根全部为黑色,此时不需要再向上回溯进行平衡操作,插入操作完成。需要注意,上面四张图的“叔”、“1”、“2”、“3”结点有可能为黑哨兵结点。
- 红黑树学习中篇
- 算法学习-中篇(持续更新)
- 黑马程序员---Java高新技术学习笔记(中篇)
- angularjs入门学习【应用剖析中篇】
- Hadoop学习笔记(安装--中篇)
- 新手学习wpf button中篇实例学习 等级4
- IOS开发学习笔记(十七)——使用地理位置及地图(中篇)
- IOS开发学习笔记(二十)——Core Data使用(中篇)
- 跟小博老师一起学习数据库 ——约束(中篇)
- 跟小博老师一起学习数据库 ——JDBC-中篇
- uC/OS-II系统学习笔记(2)——实时操作系统概念中篇
- 在 2017 年学习 React + Redux 的一些建议(中篇)
- 机器学习高斯混合模型(中篇):聚类求解
- 机器学习高斯混合模型(中篇):聚类求解
- 中篇美国人经营之道 一中篇美国人经营之道
- 敏捷软件开发[中篇]
- SQL查询入门(中篇)
- Clojure STM 笔记-中篇
- 程序理解和时间分析
- Unique Binary Search Trees II
- SSH_框架,java一个简单的查询,并显示在jsp页面上
- Kinect2.0硬件介绍
- 对于jsp的input隐藏域赋值和服务器端取得隐藏域的问题
- 红黑树学习中篇
- Android如何防止apk程序被反编译
- MATLAB中plot函数的LineSpec参数
- java面向对象理解
- 细说Unity3D(一)——移动平台动态读取外部文件全解析
- hive的基本命令
- php通过session实现upload_progress
- activiti创建流程23张表结构
- 深入Java中String类