在面试官面前优雅地种下红黑树
前言
希望面对面试官的各种红黑树的灵魂拷问时,也能像标题一般,优雅地娓娓道来。
目录
一、红黑树的基本性质
二、为什么要用红黑二叉树
1、 二叉搜索树(Binary Search Trees)
2、二叉平衡搜索树(Balanced binary search trees)
3、 总结:为什么要用红黑树
三、红黑树的插入
1、父节点为黑色
2、父节点为红色,叔叔节点为红色
3、父节点为红、叔叔节点为黑,新节点是祖父节点的右子节点的右子节点(上表中的:右右)
4、 父节点为红、叔叔节点为黑,新节点是祖父节点的左子节点的左子节点(上表中的:左左)
5、 父节点为红、叔叔节点为黑,新节点是祖父节点的右子节点的左子节点(上表中的:右左)
6、 父节点为红、叔叔节点为黑,新节点是祖父节点的左子节点的右子节点(上表中的:左右)
四、删除节点
五、红黑树的应用场景
六、结尾
一、红黑树的基本性质
先简单地说一下红黑树的规则:
1、根节点为黑色
2、叶子节点(值为NULL的节点)为黑色
3、红色节点的子节点为黑色
4、新插入的节点为红色
5、从一个节点访问到叶子节点,任意一条路径上黑色节点的数量相同
二、为什么要用红黑二叉树
面试官也会有其他的问法:“为什么有了BST和AVL,还要用红黑树呢?”想要清楚地回答这些问题,就要先了解二叉搜索树和二叉平衡搜索树。
1、 二叉搜索树(Binary Search Trees)
所谓二叉搜索树,可提供对数时间的元素插入和访问。二叉搜索树的节点放置规则是:任何节点的键值一定大于去其左子树中的每一个节点的键值,并小于其右子树的每一个节点的键值。
可以看到,二叉树的插入、查询数据时,只需要和每一层的一个数据比较就行了,这就说明,插入和查询的时间复杂度取决于树的高度。
缺点: 当插入的数据有序时,二叉树会退化为一个链表,查询或插入的时间复杂度降为logN
2、二叉平衡搜索树(Balanced binary search trees)
为了解决BST的缺点,AVL应运而生。
AVL的性质:
1、拥有二叉树的全部特性;
2、每个节点的左子树和右子树的高度差不超过1;
3、左右两个子树都是一棵平衡二叉树
为了满足第二点性质,平衡二叉树的节点不会出现一边倒的情况,但是需要做大量的操作(左旋、右旋等)来满足这一条件,使得其最坏情况下查找的时间复杂度也还是为O(logn)。
AVL树的构建这里就不多赘述了,我们主要来讲红黑树。
3、 总结:为什么要用红黑树
用一句话来概括就是:BST会退化为链表,AVL太麻烦,红黑树是一个折中的办法。
虽然AVL树解决了二叉搜索树退化了近似链表的缺点,但是由于每个节点的左子树和右子树的高度差不超过1这个要求实在是太严苛了,导致每次插入和删除节点的时候很容易就破坏了这条规则,之后就需要左大量的左旋和右旋来进行调整时期再次符合AVL树的要求。
所以如果在插入和删除很频繁的场景中,AVL树需要很频繁地进行调整,这样的话效率就大大降低了,为了解决这个问题所以出现了红黑树。(如果在面试中接下来这里就可以说出红黑树的那5个特点)。
正由于红黑树的这些特点,使其最坏情况下不仅还能维持用O(logn)
的时间复杂度找到某个节点,而且与AVL树相比,优势就在于不会那么频繁地破坏红黑树的规则,从而不用那么频繁地进行调整,这就是我们大多数情况下使用红黑树的原因。
所以红黑树是一种相对AVL树来说不那么严格的平衡树,也就是一种折中的方案,介于普通的二叉搜索树和AVL树之间。极端情况下左右子树的节点数(也就是深度)相差一倍,也就是左边都有黑节点,右边都是红黑相间,右子树的节点数或者说深度就也是左子树的2倍,这个要求就比AVL树的相差最多只能为1宽松多了,因此调整也就更少,效率也就更高。
三、红黑树的插入
插入的节点为红色节点,而要满足红黑树的那5个性质,就需要旋转和变色,先说一下旋转和变色的规则,表格来自B站UP主free-coder(尊重一下知识产权):
可能乍一看表格还看不太懂,那么我们来根据表格把所有的情况都解释一下:
1、父节点为黑色
直接插入即可
2、父节点为红色,叔叔节点为红色
先看一下完整过程,再分解步骤
(1)原树
(2)加入新节点
(3)父、叔变黑,祖父变红
(4)将祖父节点看作新插入节点,递归表格中的规则(这里祖父节点为根节点,所以变为黑节点了)
3、父节点为红、叔叔节点为黑,新节点是祖父节点的右子节点的右子节点(上表中的:右右)
新增节点的父节点为20,红色;叔叔节点为null叶子节点,黑色。
4、 父节点为红、叔叔节点为黑,新节点是祖父节点的左子节点的左子节点(上表中的:左左)
其实和3是对称的。
5、 父节点为红、叔叔节点为黑,新节点是祖父节点的右子节点的左子节点(上表中的:右左)
在第一次右旋之后,就变成了3中的情况。
6、 父节点为红、叔叔节点为黑,新节点是祖父节点的左子节点的右子节点(上表中的:左右)
和5中对称。经过一次左旋之后,变成4中情况,再进行一次右旋后,变色。
四、删除节点
等我强大一点再来吧(肝不动了~~~~)
五、红黑树的应用场景
1、JDK的HashMap、TreeMap和TreeSet
2、Linux内核的虚拟内存管理
3、Nginx的Timer管理
4、C++的STL
这里要注意,如果面试官问到这个问题,你回答HashMap中用过,那下一步多半是要问问你HashMap中怎么用的,接下来可能就是问HashMap的原理……。所以回答这些名词的时候一定要确保自己顶得住接下来可能出现的夺命连环问,千万不要贪多只背这些名字。
六、结尾
种下的不仅是红黑树,更是对offer的憧憬。
参考:红黑树,这次终于拿下了
在面试官面前优雅地种下红黑树相关推荐
- 醒醒!临时抱佛脚背Java面试题的在面试官面前是根本没有用的
醒醒!临时抱佛脚背Java面试题的在面试官面前是根本没有用的! Java架构老李 2020-11-19 17:17:09 744 收藏 33 分类专栏: Java 面试 编程语言 文章标签: 数据库 ...
- 面试官让我讲下线程的WAITING状态,我笑了
转载自 面试官让我讲下线程的WAITING状态,我笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑... 一个正在无限期等待另一 ...
- 面试官让我讲下线程的TIMED_WAITING状态,我又笑了
转载自 面试官让我讲下线程的TIMED_WAITING状态,我又笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑,可以撮这里 - ...
- 面试之必掌握知识点:红黑树(一)
面试之必掌握知识点:红黑树(一) 现如今,国内大厂的面试是卷之又卷,像红黑树这种高级平衡树算法也经常会在面试中被问起,很多同学对红黑树一直保持一知半解的状态,为了能在面试中脱颖而出,今天我们一起来梳理 ...
- 面试官 | 如何优雅的设计Java 异常?
作者 | lrwinx 来源 | lrwinx.github.io 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问. 异常的类别 正如我们所知道的,java中的异常的 ...
- 【带你装逼带你飞】吐血总结了这五大常用算法技巧,让你在同事/面试官面前惊艳全场!
对于算法技巧,之前的文章也写过一些算法技巧,不过相对零散一些,今天我把之前的很多文章总结了下,并且通过增删查改,给大家总结一些常用的算法解题技巧,当然,这些也不是多牛逼的技巧,不过可以让你的代码看起来 ...
- 高端的面试从来不会在HashMap的红黑树上纠缠太多
前言 在一场面试中最能打动面试官的其实是细节,候选人对细节的了解程度决定了留给面试官的印象到底是"基础扎实"还是"基础薄弱",如果候选人能够举一反三主动阐述自己 ...
- NGINX下红黑树的删除(终章)附GIF
接着上一篇我们就只剩下了红黑树的删除了,这也是较为复杂的操作(原理一套gif(只是简单部分),代码两套gif(困难部分博主会从头讲到尾)),因为删除操作比较复杂,所以博主打算简单一套,复杂一套,希望大 ...
- sqlserver检测到基于一致性的逻辑_面试官;解决分布式场景下数据一致性问题
在这一篇中主要回答目前分布式事务问题是怎么解决的?行业中有什么解决方案?这些解决方案分别有什么优缺点?别人是怎么做的?我们可以怎么来做? 支付重构 考虑支付重构的时候,自然想到原本属于一个本地事务中的 ...
最新文章
- PostgreSQL教程(二):SQL语言
- java 同步块 抛出异常_java问题合集(一)
- RabbitMQ之监控(1)
- Semantic Web 文章目录
- .NET Core 和 .NET Framework 之间的关系
- php ajax files 空,javascript - ajax上传文件后台使用$_files接受为空
- day34-2 类和对象(重点)
- vb利用计算机 鸡兔同笼,VB程序题:利用计算机解决古代数学瓿“鸡兔同笼问题”。即已知在同一笼子里有总数为m只鸡和兔,鸡和兔的总脚数为n只,求鸡和兔各有多少只? VB源码 龚沛曾...
- 灵悟礼品网上专卖店——新建数据库
- 计算机优化英语课堂教学,多媒体课件优化英语课堂的反思性研究
- 洛谷 3097 USACO13DEC 最优挤奶 Optimal Milking
- 来自《星际迷航》的灵感启发
- UVM入门与进阶学习笔记1——UVM概述、类库地图、工厂机制、覆盖方法
- Navicat Premium 15导入excel表格
- 【MySQL从入门到精通】【高级篇】(九)InnoDB的B+树索引的注意事项
- 安Linux基础入门教程
- 企业高性能缓存----varnish
- 两年数据对比柱形图_2018年、2019年的数据对比图!想学习这种对比图的做法!安排...
- 操作系统(四)——文件管理
- 电力电子技术的matlab实践 pdf,MATLAB 在电力电子技术中的应用.pdf