说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。

前言

在前面的章节中,我们探讨了二叉搜索树,且针对二叉搜索树的弊端(在数据有序时,最坏的情况下树结构会退化成链表)介绍了二叉平衡树中的AVL树,这一章节我们继续来探讨另一种二叉平衡树——红黑树。

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。

01—红黑规则

当插入(或者删除)一个节点时,必须遵循一定的规则,它们被称为红黑规则。如果遵循这些规则,树就是平衡的:(新插入的节点默认为红色

  • 每一个节点不是黑色就是红色

  • 根总是黑色的

  • 如果节点是红色的,则它的子节点必须是黑色的,反之则不一定成立

  • 从根到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(称为黑色高度,即两边的黑色高度需要保持一致)

02—颜色变换

我们继续引入上图中的红黑树,并为其插入新数据8,此时,数据8应该为10的左子节点(如下图),插入后结构显得不那么平衡了,但仍然遵守四条红黑规则,所以插入后的数据并未打破该结构的平衡。

但是当我们再插入一个数据6时,就会出现下面的情况

此时的结构明显违反了第三条红黑规则(红节点的子节点都应该为黑色),为了不让6节点破坏我们第三条的红黑规则,我们可以将6节点的颜色从红色转为黑色(如下图)

此时的结构已经遵守了第三条红黑规则(红节点的子节点为黑色),但新的问题又来了,我们为了让新的节点不破环规则三,对其进行了颜色的变换,这样使得我们破坏了第四个红黑规则(所有叶子节点的查找路径黑节点数目相同)。因为查找叶子节点6时,路径下有三个黑节点;查找叶子节点80时,路径下只有两个黑节点,两边黑色高度不一致,明显已经不遵守第四条红黑规则。

通过上面的实验不难得知,一棵树如果超过了两层不平衡(一边的子树比另一边的子树高两层以上),是不可能满足红黑规则的,因为如果一条路径上的节点数比另一条路径上的节点数多一个以上,那它或者有更多的黑色节点,或者有两个相邻的红色节点,都会违背红黑规则。

03—旋转

为了平衡一棵树,需要重新手动地排列节点,如果大部分节点都在根的左侧,就需要把一些节点移到右侧,称为左旋;如果大部分节点都在根的右侧,就需要把一些节点移到左侧,成为右旋。这里所说的选左旋与右旋是相对于一棵子树的根节点而言的。

下面我们来看看一个右旋的简单例子:(旋转前)

(旋转后)

在进行左右旋时,我们除了对节点进行旋转外,我们还需要对树的结构进行考虑,旋转的前后都需要遵循基本的二叉树规则和红黑规则(下面我们来举例一个较为复杂的右旋转)。

(旋转前)

(旋转后)

04—插入

插入或删除操作,都有可能改变红黑树的平衡性,利用颜色变化与旋转这两大法宝就可应对所有情况,将不平衡的红黑树变为平衡的红黑树。

在进行颜色变化或旋转的时候,往往要涉及祖孙三代节点:

  • X:表示操作的基准节点

  • P:代表X的父节点

  • G:代表X的父节点的父节点

05—插入情况一(X为外侧节点)

当基准点x在外侧的情况时,我们需要采取下面三个步骤:

  • 改变G的颜色

  • 改变P的颜色

  • 以G为中心进行向X上升的旋转

(旋转后)

06—插入情况二(X为内侧节点)

当X为内侧的节点时,会比在外侧复杂一点,我们需要将X从内侧节点通过颜色的变化和旋转变更为外侧节点,然后在进行旋转即可。主要可分为下面的四个步骤:

  • 改变G的颜色

  • 改变X的颜色

  • 以P为中心向X上升的方向旋转

  • 以G为中心向X上升的方向旋转

(初始状态)

(将内侧节点旋转为外侧节点)

(插入成功)

07—删除

与插入操作一样,我们在删除一个节点的时候,也有可能破坏一颗红黑树的结构,我们需要在规则被破坏时,对树进行一定的调整。

删除操作在大体上分为三类情况:

  • 需要删除的节点为叶子节点

  • 需要删除的节点有一个子节点

  • 需要删除的节点有两个子节点

08—需删除的节点为叶子节点

当需要删除的节点为叶子节点时,即需要删除的节点没有子节点,也会出现多种情况:

①需删除叶子节点为红色:(如下图,当我们需要删除30或者50时,只需要将40对应的子节点置为null即可)

②需要删除的节点为黑色:

-.需要删除的黑色节点父节点为红色:

②-①-.需要删除的节点的兄弟节点没有左子树:(如下图)

需要将30节点删除后,围绕40做左旋转,删除成功(如下图)

②-①-.需要删除的节点的兄弟节点存在左子树:(如下图)

在删除节点40时,我们需要围绕其兄弟节点做一次右旋转(如下图)

《数据结构与算法之红黑树(Java实现)》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 第三天:创建型模式--建造者模式
  2. python编程入门指南磁力下载-使用python 将bt转磁力链接
  3. Linux 软件包管理命令
  4. java添加文字水印插件_java之io添加文字水印
  5. 高效率Oracle SQL语句
  6. LeetCode 288. 单词的唯一缩写(哈希)
  7. php从网页获得数据,php根据URL获得网页内容
  8. 我在公司内部的分享(秒针系统)
  9. springboot Cacheable(redis),解决key乱码问题
  10. Windows便签快捷键
  11. 关于EAN13码的设置问题
  12. PS教程:用Photoshop创建唯美月夜…
  13. ROG 冰刃4 在 Ubuntu 环境下安装NVIDIA驱动
  14. 三星手机提取微信聊天数据
  15. 什么是SOA?什么是ESB?及其在银行业中是如何发展的?
  16. 快速把整篇英语短文拆分成各个单词
  17. 反洗钱机器学习_为什么不使用机器学习来打击洗钱活动?
  18. 2012年考博英语参考书大比拼,华慧考博新东方占前三甲
  19. 入库/供应商管理库存(SMI)
  20. easyuefi只能在基于uefi启动的_systemd时代的开机启动流程(UEFI+systemd)

热门文章

  1. Linux常用 bash命令
  2. HTML复选框的全选、全不选以及单选操作。
  3. Socket hang up
  4. 侯捷C++视频笔记——C++面向对象高级编程(上)
  5. D3.js 绘制立体柱状图
  6. 【转】智力题解答汇总
  7. JS——mouseover和mouseenter的区别
  8. 记入职一个星期(Java后端转Android游戏开发)
  9. 【考研高数-高等数学-基础】第二章 导数与微分
  10. 【python】批量实现modis数据的辐射定标,大气校正及地形校正