热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

红黑树原理(RB-TreePrinciple)

RB-TreePrincipleCreateby疯子济南高新区最近项目组不是很忙,闲暇之
                RB-Tree Principle
Create by 疯子 济南高新区

最近项目组不是很忙,闲暇之际,学了点数据结构的知识。

其实早就列入The Toad Of Alibaba计划之中了,只是这个知识点比较繁杂,单独拿出时间和文章阐述一下,红黑树在大学的数据结构没有涉及,他是AVL的变种和升级,大学着重基本原理就只有AVL,而红黑树是为了满足企业级的开发捣鼓出来的为了节省成本的一种数据结构,本文讲解的RBTree只有插入部分,没有删除部分,因为只有插入比较易懂,而且诠释了红黑树的基本原理,而删除不论是在AVL还是在RBTree中都是最复杂的一步,此文只讲原理不讲代码。

* 关键词以及概念准备*

在讨论之前先定义本文所使用的结点命名以及树的规则如下
命名:
X:要插入的结点,或者是特殊的结点
P:X结点的父结点
G:P的父结点
RBTree的规则:
(1)每一个结点不是红色的就是黑色的。
(2)根总是黑色的。
(3)如果结点是红色的,那么他的子结点必须是黑色的(反之倒不一定必须为真)。
(4)从根到叶结点或空子结点的每条路径,必须包含相同数目的黑色结点。
子结点类型:
(1)外侧子孙节点(左子节点)
(1)外侧子孙节点(左子节点)
(2)右侧子孙节点(右子节点)
(2)右侧子孙节点(右子节点)
(3)外侧子孙节点(右子节点)
(3)外侧子孙节点(右子节点)
(4)内侧子孙节点(左子节点)
(4)内侧子孙节点(左子节点)
图中说明了将要插入子结点X的位置的的四种情况,总结为内侧子孙节点和外侧子孙节点。

当我们要往树里边插入一个节点的的时候分下边3个步骤:
(1) 在下行路途中的颜色变换。
(2) 在向下路途上的旋转
(3) 插入结点之后的旋转。
但是第二步和第三步顺序我们颠倒过来讲解,因为第三步的旋转理解之后对第四部的旋转的理解是轻而易举的。

1、 在下行路途中的颜色变换。

解释:
从root根结点开始向下搜索,当碰到如下情况是要进行颜色的变换
发现一个黑色结点有2个红色子结点,把2个红色子结点颜色变为黑色,父结点颜色变为红色(如果父结点为根,那么父结点还是黑色,遵守规则一)。
如图:
这里写图片描述

2、 插入结点之后的旋转。

2.1解释:
结点插入之后可能会造成树的规则的破坏,需要对树重新调整。
2.2调整策略:
新插入的节点有3中可能的情况:
如图:
这里写图片描述
(1) P是黑色的。
(2) P是红色的,X是G的外侧子孙节点。
(3) P是红色的,X是G的内侧子孙节点。
调整方案:
(1) P是黑色的。
如果P是黑色的什么事也不做 直接把节点插入即可。
(2) P是红色的,X是G的外侧子孙节点。
如图:
这里写图片描述
调整方法:
1) 改变X的祖父节点G(本例中是25)的颜色。
2) 改变X的父节点P(12)的颜色。
3) 以X的祖父节点G(25)为顶旋转,向X(6)上升的方向,在本例中是右旋。
如图是调整后的树:

这里写图片描述

(3)P是红色的,X是G的内侧子孙节点。
调整步骤:
1) 改变X的祖父节点(本例中为25)的颜色。
2) 改变X(18)的颜色。
3) 用X的父节点P(12)作为顶旋转,向X上升的方向旋转,本例是左旋。
4) 再以X的祖父节点(25)为顶旋转,向X上升的方向旋转(本例为右旋)。
这里写图片描述
这里写图片描述
这里写图片描述

3、 在向下路途上的旋转

解释:在从根结点向下搜索遍历寻找插入位置的时候,会进行中途结点颜色的调整(即步骤一),以便于搜索继续向下进行,旋转之后可能会造成红-红冲突(规则三),出现冲突就需要进行树的旋转调整。
在向下的路径上有2中旋转的可能性:
(1) 外侧子孙节点。
(2) 内侧子孙节点。
3.1 外侧子孙节点
先说外侧子孙节点的情况,开始的时候只有一个根节点50,依次插入25,75,12,37,6,18。记住每次插入的新结点X颜色都是红色的。
注意:在插入12和6时需要进行颜色变换, 现在要插入值为3的节点,必须对12 以及他的子节点6和18 做颜色变换,下面会讲到。讲解的过程中遇到上边的第一种情况时会着重提醒。
本过程连带插入的过程,这也是先将插入过程的原因。
这里写图片描述
这里写图片描述
(3) 插入结点X(12)此时与父节点P发生红-红冲突(规则三),要先进行颜色变换才能将12插入,前边说过在向下搜索的时候如果遇到这种冲突就要进行颜色变换(根节点不变总是黑的)。
这里写图片描述
这里写图片描述
这里写图片描述
(6)在将要插入6的时候有遇到第三步的情况出现红-红冲突。按照第三步的做法进行调整(25为非根节点此时变为红色)。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
(10)颜色变换后会出现红-红颜色冲突,即12和他的父亲25颜色冲突,此时遇到前边说的第一种情况(在向下路途上的旋转遇到的外侧子孙节点的情况)这种情况的解决方案如下:
(10.1)改变X的祖父节点G(50)的颜色,忽略根必须是黑色的规则。
(10.2)改变X的父节点P(25)的颜色。
(10.3)以X的祖父节点G(50)为顶旋转,向X上升的方向旋转(右旋)。

这里写图片描述
(11)调整后的RB-Tree,此时要插入节点3,又会遇到一个黑色加点下边有2个红色节点的情况,那么就改变25、12、50的颜色,然后插入节点3,见下一步。
这里写图片描述
(12)变换颜色后插入节点3。
至此一颗树从一个节点到构件完成的过程走完了(为了讲解在向下路途上的旋转遇到外侧子孙节点的情况,顺便把前边的知识串了一下),接下来再说在向下路途上的旋转遇到内侧子孙节点的情况。

3.2 内侧子孙节点

   树的构件过程在这一步不再细致的说明了,在3.1已经过了一遍,只说最后遇到内侧子孙节点的情况。
解决方案:
(1)
根为50,依次插入25,75,12,37,31,43,在插入12和31之前需要变换颜色。

现在试着插入一个新的节点,值为28,需要做颜色变换(节点37处),这时会出现红-红冲突,如图:
这里写图片描述
变换之后:
这里写图片描述
最后插入节点28之后:
这里写图片描述


推荐阅读
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 如何查询计算机的显卡型号及性能参数? ... [详细]
  • 在《数字图像处理及应用(MATLAB)第4章》中,详细探讨了“逢七必过”游戏规则的实现方法,并结合数字图像处理技术进行了深入分析。本章通过丰富的实例和代码示例,展示了如何利用MATLAB实现这一游戏规则,并介绍了数字图像处理的基本原理和技术应用。内容涵盖了图像增强、滤波、边缘检测等多个方面,为读者提供了全面的技术支持和实践指导。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • iPhone 11的几大痛点与小聪明:苹果的精明策略分析
    面对一个直截了当的问题:新款iPhone 11没有5G功能,你会购买吗?在这一年里,苹果面临了自初代iPhone发布以来最尴尬的业绩挑战。尽管iPhone在过去十年中持续热销,推动苹果成为全球市值最高的公司之一,但苹果现在正通过大力拓展服务业务来应对这一困境。此外,苹果还采取了一系列精明的策略,如优化成本控制和提升用户体验,以保持其市场竞争力。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • 数据库多表联合查询:内连接与外连接详解
    在数据库的多表查询中,内连接和外连接是两种常用的技术手段。内连接用于检索多个表中相互匹配的记录,即只有当两个表中的记录满足特定的连接条件时,这些记录才会被包含在查询结果中。相比之下,外连接则不仅返回匹配的记录,还可以选择性地返回不匹配的记录,具体取决于左外连接、右外连接或全外连接的选择。本文将详细解析这两种连接方式的使用场景及其语法结构,帮助读者更好地理解和应用多表查询技术。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树
    深入探讨:Java 8 中 HashMap 链表为何选择红黑树而非 AVL 树 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
author-avatar
Coco__GLL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有