二、面试题
面:考你几个红黑树的知识点🦀
- 红黑树的数据结构都用在哪些场景,有什么好处?
- 红黑树的时间复杂度是多少?
- 红黑树中插入新的节点时怎么保持平衡?
面:2-3树都是不没看,回去等消息吧!
三、2-3树与红黑树的等价性
红黑树规则
1. 根节点是黑色
2. 节点是红黑或者黑色
3. 所有子叶节点都是黑色(叶子是NIL节点,默认没有画出来)
4. 每个红色节点必须有两个黑色子节点(也同样说明一条链路上不能有链路的红色节点)
5. 黑高,从任一节点到齐每个叶子节点,经过的路径都包含相同数目的黑色节点
那么,这些规则是怎么总结定义出来的呢?接下里我们一步步分析讲解。
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