热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

红黑树操作及实现

红黑树性质红黑树是广泛应用的平衡二叉搜索树之一(另外一种常见的平衡二叉搜索树是AVL树)。它是SGISTL唯一实现的一种搜索树;是关联容器的底部机制。
红黑树性质

        红黑树是广泛应用的平衡二叉搜索树之一(另外一种常见的平衡二叉搜索树是AVL树)。它是SGI STL唯一实现的一种搜索树;是关联容器的底部机制

       和AVL树所实现的平衡机制不同,但是同样适用了单旋转和双旋转操作修正树以保证平衡。

       红黑树的性质:

              1. 每个节点都被着上黑色或者红色。

              2. 根节点是黑色。

              3. 如果一个节点为红色,那么其子节点必须都为黑色。

              4. 任一节点到NULL指针的每条路径上必须包含相同数目的黑节点(将NULL视为黑色)。

        根据性质4,新插入的节点必须为红色,否则若新插入节点为黑色,则会使得该节点所在的路径上的黑节点个数增加。

        根据性质3,新插入节点的父节点必须为黑色(因为上面已经证明新插入节点必须为红色)。如果新节点插入后其父节点不为黑色则就要通过改变节点颜色和旋转树来保证红黑树性质。这就是下边插入操作比较麻烦所在。


红黑树的插入操作

约定: X为新节点,P为父节点,G为祖父节点,S为叔节点,GG为曾祖父节点。

分以下两种情况(父节点为黑或红)讨论插入操作:

一、 父节点为黑色

         直接插入X,插入操作完成。

二、父节点为

在第一部分已经讨论了,当父节点为红色,就会违背红黑树的性质,要调整树、改变节点颜色;此时,根据X插做左孩子还是右孩子和外围节点(S和GG)的颜色,再分以下几种情况讨论:

情况1: S为黑且X为左孩子

         在P和G之间做一次右旋转并改变G和P的颜色,即可。

        注意,旋转后可能会使树的高度相差大于1,例如当图中A、B为空但D或E不为空时。但这没关系,因为红黑树的平衡性本来就比AVL树弱,然而红黑树通常能导致良好的平衡状态。红黑树与AVL树平均效率相当,最坏情况下花费O(logN)。

情况2:S为黑且X为右孩子

        将P和X经过一次左旋转便可以变回情况1的情形;改变G和X的颜色,然后再对G做一次右旋转,即可。从这里的操作可以看出,所谓的双旋转其实就是两次单旋转

情况3:S为红

       分析此时所存在的问题:当S为红色的时候,如图5-15c所示,此时对P和G做一次旋转并改变X的颜色。此时,如果GG为黑色,那么该操作完成。但是,如果GG为红色,那么,旋转后的G和GG均为红色,不符合红黑树性质。

        解决方法:当遇到这种情况的时候,我们可以采取的方式有两种:上滤和自顶向下。以下分别介绍这两种方法。


上滤法

        当GG也为红色时,将情况3中提到的方法继续沿着根的方向上滤,直到不再有父子连续为红色的情况。

自顶向下法

         该方法是自上而下来保证S不会为红色的过程。在向下的过程中,当遇到一个节点X的两个儿子都是红色,就将X改为红色,而将两个儿子改为黑色。这种翻转只在X的父节点也为红色时才会破坏红黑树的性质,但是可以使用情况1或情况2中的方法做调整。这个过程能够保证不会遇到S节点为红色的情况;因为我们是自上而下调整的,在调整到G节点时,已经将可能存在的、P和S同时为红的情况破坏了。

        例如5-15e中,在寻找35插入的位置的过程中,我们从根节点开始寻找35应该插入的位置,其寻找的路径为图中虚箭头所示的方向,在该向下找过程中,当X为50的时候,X的两个孩子都是红色,此时将X改为红色,而将它的两个孩子改为黑色;然后继续找35应该插入的位置,这样就确保了不会存在S为红色的情况。


红黑树的删除操作



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 开发笔记:Docker 上安装启动 MySQL
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker上安装启动MySQL相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
lksxq_468
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有