01基础-算法第四版红黑树-红黑树-数据结构和算法(Java)
文章目录
- 1 前言
- 2 定义
- 2.1 替换3-结点
- 2.2 等价定义
- 2.3 一一对应
- 3 基础
- 3.1 颜色表示
- 3.2 结点表示
- 3.2 旋转
- 3.3 旋转后重置父结点的链接
- 后记
1 前言
目前我学习到的2种红黑树:一种是红黑树的标准定义,另外一种是《算法第4版》中的红黑树。后一种定义只比前一种多了一个条件:红链接均为左链接(红色结点均为左子结点)。
关于对红黑树的理解,可以把它当做前面我们学习的2-3树的一种特殊形式,按照2-3树的思想来学习理解。那如果之前没有接触过2-3树呢?拿就把它当做一种新的二叉树结构来学习就好,没必要纠结这个。只要最终我们实现它的基本操作,且操作完成后它依然符合红黑树的性质(定义)就好。
我们先来讲解第二种定义的红黑树,按2-3树来理解,主要参考《算法第4版》;后面会以一种新的二叉树的视角来讲解第一种红黑树,主要参考JDK8+ 的HashMap中的红黑树。最后,我们会对这两种方式做对比。
2 定义
2.1 替换3-结点
红黑二叉查找树基本思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。我们把树中的链接分为2中类型:红链接将两个2-结点连接起来构成一个3-结点,黑链接则是2-3树中的普通链接。确切的说我们将3-结点表示为一条左斜的红色链接(两个2-结点其中之一是另外一个的左子结点)相连的两个2-结点。
2.2 等价定义
红黑树的另外一种定义是含义红黑树链接并满足下列条件的二叉查找树:
- 红链接均为左链接
- 没有任何一个结点同时和两条红色链接相连;
- 该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同。
满足这样定义的红黑树和相应的2-3树是一一对应的。
2.3 一一对应
如果将一棵红黑树中的红链接画平,那么所有的空链接到根结点的距离都将是相同的。如果我们将由红链接相连的的结点合并,得到的就是一棵2-3树。相反,如果一棵2-3树中的3-结点画作由红链接链接的2-结点,那么不会存在能够和两条红链接链接的结点,且树必然是完美黑色平衡的,因为黑链接即2-3树中的普通链接,根据定义这些链接必然是完美平衡的,如下图所示:
因此,如果我们能够在保持一一对应关系的基础上实现2-3树的插入算法,那么我们就能够将两个算法的有的结合起来:二叉查找树中简洁高效的查找方法和2-3树中高效的平衡插入算法。
3 基础
3.1 颜色表示
方便起见,因为每个结点都只会有一条指向自己的链接(从它的父结点指向它),我们将结点的颜色保存在表示结点的Node数据类型的布尔变量color中。如果指向它的链接是红色的,那么该变量为true,黑色则表示false。我们约定空链接为黑色。为了代码的清晰,定义了2个常量RED和BLACK来设置和测试这个变量。我们使用私有方法isRed()来测试一个结点和它的父结点之间链接的颜色。isRed源代码如下:
/*** 链接(结点)颜色 RED = true表示红链接;BLACK = false表示黑链接*/
private static final boolean RED = true;
private static final boolean BLACK = false;
/*** 判断当前结点和父链接是否为红色* @param x 当前结点* @return 当前结点不为空且当前结点color属性为RED,返回{@code true};否则返回{@code false}*/
private boolean isRed(Node x) { return x != null && x.color == RED;}
3.2 结点表示
/*** 结点类*/
class Node {/*** 键*/K key;/*** 值*/V value;/*** 左右链接(子结点)*/Node left, right;/*** 子树结点个数*/int n;/*** 链接颜色*/boolean color;public Node(K key, V value, Node left, Node right) {this.key = key;this.value = value;this.left = left;this.right = right;// 默认新建结点为根结点的子树结点个数为1this.n = 1;// 默认新建结点颜色为红色this.color = RED;}public Node(K key, V value) {this(key, value, null, null);}
}
3.2 旋转
在我们实现的某些操作中可能会出现红色链接或者两条连续的红链接,但在操作完成之前这些情况都会被小心地旋转并修复。选择操作会改变红链接的指向。把一条红色的右链接转化为左链接,称为左旋[转]。如下图所示:
非递归左旋代码3.2-1实现如下:
/*** 以子树根结点为轴左旋* @param p 子树根结点* @return 左旋完成后的子树根结点*/
private Node rotateLeft(Node p) {// 调整链接Node x = p.right;int n = 1 + (x.right == null ? 0: x.right.n);p.right = x.left;x.left = p;// 调整颜色x.color = p.color;p.color = RED;// 计算结点数x.n = p.n;p.n = x.n - n;return x;
}
把一条红色左链接转化为右链接,称为右旋[转],图示如下:
非递归代码实现代码3.2-2如下:
/*** 以子树根结点为轴右旋* @param p 子树根结点* @return 右旋完成后的子树根结点*/
private Node rotateRight(Node p) {// 调整链接Node x = p.left;int n = 1 + (x.left == null ? 0: x.left.n);p.left = x.right;x.right = p;// 调整颜色x.color = p.color;p.color = RED;// 计算结点数x.n = p.n;p.n = x.n - n;return x;
}
3.3 旋转后重置父结点的链接
无论是左旋还是右旋,操作完成后返回一条链接,我们会把它赋予父结点中链接,可能是红色也可能是黑色。这可能产生两条连续的红链接,我们会通过旋转操作修正。
后续讲解插入、删除、有序性想关操作等。
后记
如果小伙伴什么问题或者指教,欢迎交流。
❓QQ:806797785
⭐️源代码仓库地址:https://gitee.com/gaogzhen/algorithm
[1][美]Robert Sedgewich,[美]Kevin Wayne著;谢路云译.算法:第4版[M].北京:人民邮电出版社,2012.10
01基础-算法第四版红黑树-红黑树-数据结构和算法(Java)相关推荐
- 《算法第四版》官方jar包中In的readStrings()方法不建议使用的解决办法
起因:在学习<算法第四版>过程中总是遇到一些算法之外的小问题,比如本书中所需要下载的库.今天在学习排序那一节时,发现排序框架main()方法中的In的readStrings()方法不能使用 ...
- 0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)
文章目录 4 插入 4.1 序 4.2 向单个2-结点插入新键 4.3 向树底部的2-结点插入新键 4.4 向一棵双键树(3-结点)中插入新键 4.5 颜色调整 4.6 根结点总是黑色 4.7 向树底 ...
- Algorithms, 4th Edition(算法-第四版)源码使用系统配置
关于-Algorithms, 4th Edition (算法-第四版)源代码在本地机器的运行配置. 其实关于这个教程的使用已经在 Java Algorithms and Clients 页面中写出,并 ...
- 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》
文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...
- 算法第四版扔鸡蛋问题
本题来源于算法第四版1.4.25.1.4.26. 同时好像记得看过的腾讯面经里也问到过类似题目,因此觉得有必要仔细做一下. 题目如下: 一幢 100 层的大楼,给你两枚鸡蛋.假设,在第 n 层扔下鸡蛋 ...
- 算法第四版- 3.1
算法第四版- 3.1 文章目录 **算法第四版- 3.1** 1.二分查找 1)LC704二分查找 2)LC744二分查找 3)LC33搜索旋转排序数组 4)搜索旋转数组进阶 2.跳表 1.二分查找 ...
- 算法第四版课后习题答案 西安电子科技大学 计算机学院 算法课
来源于西电计算机15级学长学姐,算法第四版课后习题答案 西安电子科技大学 计算机学院 算法课. 再推荐一个好的看答案的地方,每一题都有,只是还没有更新完成. 地址:https://alg4.ike ...
- python基础教程书在线阅读_python基础教程第四版
第四版 pdf电子书是一部非常实用的python编程语言学习的电子书籍,无论你是刚接触编程或者刚接触Python,通过这部电子书就能让你快速入门,感兴趣的朋友欢迎来绿色资源网免费下载阅读. pytho ...
- WordNet 普林斯顿 算法第四版
普林斯顿 算法第四版 本文的代码以及之前的作业代码可通过一下github链接获得 https://github.com/Changjing-Liu/algorithm_lab 文章目录 普林斯顿 算法 ...
- BoggleSolver 普林斯顿 算法第四版
BoggleSolver 普林斯顿 算法第四版 文章目录 BoggleSolver 普林斯顿 算法第四版 一. 引言 1. Boggle 2. 计分 3. Qu特殊情况 4. 任务要求 二.分析 1. ...
最新文章
- 阿里达摩院再造AI抗疫技术:20秒判读CT影像,识别准确率达96%
- android线程栈默认大小,线程的默认最大堆栈大小 - Internet Information Services | Microsoft Docs...
- 一、pytorch搭建实战以及sequential的使用
- 一秒钟就破解!2020年最烂密码出炉,看看你的上榜没?
- 520 页机器学习笔记!图文并茂可能更适合你
- WebRTC通话原理
- Docker 存储选型,这些年我们遇到的坑
- css div中文字位置_计算机二级Web(4):CSS基础 (上)
- 【Node】—nrm的简单使用
- 显示和隐藏Mac隐藏文件的命令
- Freeswitch在内网,由服务器防火墙映射出来,IMSDROID作为被叫的问题
- ibm watson_使用IBM Watson Assistant构建AI私人教练-第1部分
- Tomcat8+redis实现session共享
- mysql alter 添加注释_我们如何使用MySQL ALTER TABLE命令在列上添加注释?
- 为什么电脑屏幕会横过来_电脑屏幕横过来了怎么办
- 基于MDKA5D31-EK_T70开发板的QT示例-demo09:LM75A温度曲线
- Duplicate entry '127' for key 'PRIMARY'
- html textarea 缩放,textarea自动撑开缩放
- 使用假设检验分析PS4,XBox,Switch 谁是最好的游戏主机
- v-charts 设置柱状图每个柱子颜色
热门文章
- 如何防止服务器被攻击?
- 摩羯座|摩羯座性格分析
- 08-SNAP的命令行处理工具gpt及其批处理(Sentinel-1和Sentinel-2为例)
- 编译原理: Subset Construction 子集构造法(幂集构造)(NFA转DFA)
- 【编译原理】NFA转DFA(子集构造法)
- 例7.14 有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。
- MyEclipse10 激活
- 手机OTG 我的世界_别再给手机外接OTG键鼠玩刺激战场了:其实还能这样操作
- 如何下载中文和英文的全文专利
- 程序设计入门-java