2021 最新网易 Java 面经,面试必会
二、面试题
面:考你几个红黑树的知识点??
红黑树的数据结构都用在哪些场景,有什么好处?
红黑树的时间复杂度是多少?
红黑树中插入新的节点时怎么保持平衡?
面:2-3 树都是不没看,回去等消息吧!
三、2-3 树与红黑树的等价性
红黑树规则
那么,这些规则是怎么总结定义出来的呢?接下里我们一步步分析讲解。
1. 为什么既有 2-3 树要有红黑树
首先2-3树
(读法:二三树)就是一个节点有 1 个或者 2 个元素,而实际上 2-3 树转红黑树是由概念模型2-3-4树
转换而来的。-4叉
就是一个节点里有 3 个元素,这在 2-3 树中会被调整,但是在概念模型中是会被保留的。
虽然2-3-4树
也是具备2-3树
同样的平衡树的特性,但是如果直接把这样的模型用代码实现就会很麻烦,且效率不高,这里的复杂点包括;
2-叉、3-叉、4-叉,三种结构的节点类型,互相转换复杂度较高
3-叉、4-叉,节点在数据比较上需要进行多次,不像 2-叉节点,直接布尔类型比较即可非左即右
代码实现上对每种差异,都需要有额外的代码,规则不够标准化
所以,希望找到一种平衡关系,既保持 2-3 树平衡和 O(logn)的特性,又能在代码实现上更加方便,那么就诞生了红黑树。
2. 简单 2-3 树转红黑树
2-3树
转红黑树,也可以说红黑树是2-3树
和2-3-4树
的另外一种表现形式,也就是更利于编码实现的形式。
简单转换示例;
从上图可以看出,2-3-4 树与红黑树的转换关系,包括;
2-叉节点,转换比较简单,只是把原有节点转换为黑色节点
3-叉节点,包括了 2 个元素,先用红色线把两个节点相连,之后拆分出来,最后调整高度黑色节点在上
4-叉节点,包括了 3 个元素,分别用红黑线连接,之后拆分出来拉升高度。这个拉升过程和 2-3 树调整一致,只是添加了颜色
综上,就是 2-3-4 树的节点转换,总结出来的规则,如下;
将 2-3-4 树,用二叉树的形式表示
3-叉、4-叉节点,使用红色、黑色连线进行连接
另外,3-叉节点有两种情况,导致转换成二叉树,就有左倾和右倾
3. 复杂 2-3 树转红黑树
在简单2-3树转换红黑树
的过程中,了解到一个基本的转换规则右旋定义,接下来我们在一个稍微复杂一点的2-3树
与红黑树的对应关系,如下图;
上图是一个稍微复杂点的 2-3 树,转换为红黑树的过程,是不这样一张图让你对红黑树更有感觉了,同时它也满足一下条件;
从任意节点到叶子节点,所经过的黑色节点数目相同
黑色节点保持着整体的平衡性,也就是让整个红黑树接近于 O(logn)时间复杂度
其他红黑树的特点也都满足,可以对照红黑树的特性进行比对
四、红黑树
1. 平衡操作
通过在上一章节 2-3 树的学习,在插入节点时并不会插到空位置,而是与现有节点融合以及调整,保持整个树的平衡。
而红黑树是 2-3-4 树的一种概念模型转换而来,在插入节点时通过红色链接相连,也就是插入红色节点。插入完成后进行调整,以保持树接近平衡。
那么,为了让红黑树达到平衡状态,主要包括染色、?左右旋转、这些做法其实都是从 2-3 树演化过来的。接下来我们就分别讲解几种规则的演化过程,以此更好了解红黑树的平衡操作。
1.1 左旋转
左旋定义: 把一个向右倾斜的红节点链接(2-3 树,3-叉双元素节点),转化为左链接。
背景:顺序插入元素,1、2、3,2-3 树保持平衡,红黑树暂时处于右倾斜。
接下来我们分别对比两种树结构的平衡操作;
2-3 树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。
红黑树,则需要通过节点的左侧旋转,将元素 2 拉起来,元素 1 和元素 3,分别成为左右子节点。
红黑树的左旋,只会处理与之对应的 2-3 树节点进行操作,不会整体改变。
1.2 右旋转
右旋定义: 把一个向左倾斜的红节点连接(2-3 树,3-叉双元素节点),转换为右连接。
背景:顺序插入元素,3、1、1,2-3 树保持平衡,红黑树暂时处于左倾斜。
接下来我们分别对比两种树结构的平衡操作;
2-3 树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。
红黑树,则需要通过节点的右侧旋转,将元素 2 拉起来,元素 1 和元素 3,分别成为左右子节点。
你会发现,左旋与右旋是相互对应的,但在 2-3 树中是保持不变的
1.3 左右旋综合运用
左旋、右旋,我们已经有了一个基本的概念,那么接下来我们再看一个可以综合左右旋以及对应 2-3 树的演化案例,如下;
以上的例子分别演示了一个元素插入的三种情况,如下;
1、3,插入 0,左侧底部插入,与 2-3 树相比,需要右旋保持平衡
1、3,插入 2,中间位置插入,首先进行左旋调整元素位置,之后进行右旋进行树平衡
1、3,插入 5,右侧位置插入,此时正好保持树平衡,不需要调整
1.4 染色
在 2-3 树中,插入一个节点,为了保持树平衡是不插入到空位置上的,当插入节点后元素数量有 3 个后则需要调整中间元素向上,来保持树平衡。与之对应的红黑树则需要调整颜色,来保证红黑树的平衡规则,具体参考如下;
2. 旋转+染色运用案例
接下来我们把上面讲解到的旋转
、染色
,运用到一个实际案例中,如下图;
首先从左侧开始,是一个按照顺序插入生产出来的红黑树,插入顺序;
7、2、8、1、4、3、5
α,向目前红黑树插入元素 6,插入后右下角有三个红色节点;
3、5、6
。β,因为右下角满足染色条件,变换后;黑色节点(3、5)、红色节点(4、6)。
γ,之后看被红色连线链接的节点
7、4、2
,最小节点在中间,左旋平衡树结构。δ,左旋完成后,红色链接线的
7、4、2
为做倾顺序节点,因此需要做右旋操作。ε,左旋、右旋,调整完成后,又满足了染色操作。到此恢复红黑树平衡。
注意,所有连接红色节点的,都是是红色线。以此与 2-3 树做对应。
3. 删除操作
根据 2-3-4 树模型的红黑树,在删除的时候基本是按照 2-3 方式进行删除,只不过在这个过程中需要染色和旋转操作,以保持树平衡。删除过程主要可以分为如图四种情况,如下;
3.1 删除子叶红色节点
红色子叶节点的删除并不会破坏树平衡,也不影响树高,所以直接删除即可,如下;
3.2 删除左侧节点
3.2.1 被删节点兄弟为黑色 &含右子节点
3.2.2 被删节点兄弟为黑色 &含左子节点
3.2.3 被删节点兄弟为黑色 &含双子节点(红)
3.2.4 被删节点兄弟为黑色 &不含子节点
3.2.5 被删节点兄弟为黑色 &含双黑节点(黑)
3.3. 删除右侧节点
3.3.1 被删节点兄弟为黑色 &含左子节点
3.3.2 被删节点兄弟为黑色 &含右子节点
3.3.3 被删节点兄弟为黑色 &含双子节点(红)
3.2.4 被删节点兄弟为黑色 &不含子节点
3.2.5 被删节点兄弟为黑色 &含双黑节点(黑)
总结
如果你选择了 IT 行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把 P8 大佬用过的一些学习笔记(pdf)都整理在本文中了,如果你有需要的话,请一定点赞分享本文,然后点击这里获取免费下载方式!
《Java 中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
评论