热门标签 | 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为红色的情况。


红黑树的删除操作



推荐阅读
  • 本文介绍了数字音视频编解码技术标准,特别是中国自主研发的AVS标准,及其在短视频软件开发中的应用。文章探讨了AVS标准的发展历程、技术特点以及与国际标准的对比。 ... [详细]
  • 本文概述了五种常用的查找算法:线性查找、二分查找、二叉搜索树查找、哈希查找和索引查找。每种方法都有其适用场景和性能特点。 ... [详细]
  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
    go,通过,map,filter,foreach,等,流,式,ap ... [详细]
  • 阿里飞猪旅行搜索技术的革新与实践
    本文由林睿(阿里飞猪)分享,经杜正海、Hoh编辑整理,并由DataFunTalk平台发布。文章探讨了旅行搜索技术从满足基本需求到集成高级功能的发展历程,特别是在阿里飞猪平台上的应用与创新。 ... [详细]
  • 本文通过C++代码示例,详细介绍了如何利用邻接矩阵构建无向图,并实现图的深度优先遍历(DFS)。文章包括了完整的代码实现,以及对关键函数的解释。 ... [详细]
  • 深入理解KMP算法及其应用
    本文详细介绍了KMP算法的原理和实现方法,包括如何计算next数组以及如何利用next数组进行高效的字符串匹配。 ... [详细]
  • Docker入门与实践指南
    本文介绍了Docker的基础知识,包括其作为开源应用容器引擎的特点,以及如何利用Docker将应用程序及其依赖项打包成轻量级的容器镜像。同时,还详细讲解了Docker的核心概念、安装过程及基本命令操作。 ... [详细]
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • Docker基础指南与核心命令解析
    本文全面介绍了Docker的基本概念、安装方法、核心命令及其用法,并深入探讨了Docker容器的数据卷管理及应用部署策略,适合初学者快速掌握Docker技术。 ... [详细]
  • Java性能优化指南 | 制定有效的性能优化策略
    探讨Java应用性能优化的方法与策略,包括性能测试技巧、常见问题及解决方案,旨在帮助开发者提升系统性能。 ... [详细]
  • 近期探讨了‘内部螺旋矩阵算法’的实现细节,并深入分析了面向对象编程中的可扩展性问题。基于这些讨论,本文通过引入桥梁设计模式对原有代码进行了优化与重构,以增强代码的灵活性和可维护性。 ... [详细]
  • 本文详细介绍了MySQL中的各种联结类型,包括自联结、自然联结、内部联结(等值联结)、外部联结(左联结、右联结、全外联结)以及交叉联结。每种联结方式都有其特定的应用场景和语法特点,了解这些可以帮助开发者更高效地编写SQL查询。 ... [详细]
  • 基于直推式学习的异质人脸图像合成技术
    本文探讨了利用直推式学习与贝叶斯推理相结合的方法,用于提升异质人脸图像合成的质量。通过将所有样本(包括训练和测试样本)纳入学习过程,旨在减少测试样本的风险误差,从而改善最终的图像合成效果。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • 在进行微信小程序开发过程中,遇到了需要实现类似微信朋友圈那样的长文本折叠功能的需求。本文将详细探讨其实现方法及注意事项。 ... [详细]
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社区 版权所有