红黑树学习

本文详细介绍了2-3树与红黑树的关系及其转换过程,强调了红黑树在代码实现上的优势。通过2-3-4树的概念模型,展示了2-3树如何转换为红黑树,并详细阐述了红黑树的平衡规则,包括左旋、右旋操作。此外,还探讨了红黑树的节点插入、删除操作及其对树平衡的影响。
摘要由CSDN通过智能技术生成

2-3数是红黑树的前身,首先 2-3 树(读法:二三树)就是一个节点有 1 个或者 2 个元素,而实际上 2-3 树转红黑树是由概念模型 2-3-4 树转换而来的。-4 叉就是一个节点里有 3 个元素, 这在 2-3 树中会被调整,但是在概念模型中是会被保留的。 虽然 2-3-4 树也是具备 2-3 树同样的平衡树的特性,但是如果直接把这样的模型用代码实现就会很麻烦,且效率不高,这里的复杂点包括;

1. 2-叉、3-叉、4-叉,三种结构的节点类型,互相转换复杂度较高

2. 3-叉、4-叉,节点在数据比较上需要进行多次,不像 2-叉节点,直接布尔类型比较即可非左即右

3. 代码实现上对每种差异,都需要有额外的代码,规则不够标准化

所以,希望找到一种平衡关系,既保持 2-3 树平衡和 O(logn)的特性,又能在代码实现上更加方便,那么就诞生了红黑树。

红黑树规则

1. 根节点是黑色

2. 节点是红黑或者黑色

3. 所有子叶节点都是黑色(叶子是NIL节点,默认没有画出来)

4. 每个红色节点必须有两个黑色子节点(也同样说明一条链路上不能有链路的红色节点)

5. 黑高,从任一节点到齐每个叶子节点,经过的路径都包含相同数目的黑色节点

简单2-3数转红黑树

 从上图可以看出,2-3-4 树与红黑树的转换关系,包括;

1. 2-叉节点,转换比较简单,只是把原有节点转换为黑色节点

2. 3-叉节点,包括了 2 个元素,先用红色线把两个节点相连,之后拆分出来,最后调整高度黑色节点在上

3. 4-叉节点,包括了 3 个元素,分别用红黑线连接,之后拆分出来拉升高度。这个拉升过程和 2-3 树调整一致,只是添加了颜色

综上,就是 2-3-4 树的节点转换,总结出来的规则,如下;

1. 将 2-3-4 树,用二叉树的形式表示

2. 3-叉、4-叉节点,使用红色、黑色连线进行连接

3. 另外,3-叉节点有两种情况,导致转换成二叉树,就有左倾和右倾

为保证红黑树达到平衡状态,主要包括染色、左右旋转

左右旋转

左旋定义: 把一个向右倾斜的红节点链接(2-3 树,3-叉双元素节点),转化为左链接。

背景:顺序插入元素,1、2、3,2-3 树保持平衡,红黑树暂时处于右倾斜。 接下来我们分别对比两种树结构的平衡操作;

1. 2-3 树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。

2. 红黑树,则需要通过节点的左侧旋转,将元素 2 拉起来,元素 1 和元素 3,分别成为左右子节点。

红黑树的左旋,只会处理与之对应的 2-3 树节点进行操作,不会整体改变。

右旋定义: 把一个向左倾斜的红节点连接(2-3 树,3-叉双元素节点),转换为右连接。

 背景:顺序插入元素,3、1、1,2-3 树保持平衡,红黑树暂时处于左倾斜。接下来我们分别对比两种树结构的平衡操作;

1. 2-3 树,所有插入的节点都会保持在一个节点上,之后通过调整节点位置,保持平衡。

2. 红黑树,则需要通过节点的右侧旋转,将元素 2 拉起来,元素 1 和元素 3,分别成为左右子节点。

你会发现,左旋与右旋是相互对应的,但在 2-3 树中是保持不变的

左右旋转综合运用

1. 1、3,插入 0,左侧底部插入,与 2-3 树相比,需要右旋保持平衡

2. 1、3,插入 2,中间位置插入,首先进行左旋调整元素位置,之后进行右旋进行树平衡

3. 1、3,插入 5,右侧位置插入,此时正好保持树平衡,不需要调整

染色

在 2-3 树中,插入一个节点,为了保持树平衡是不插入到空位置上的,当插入节点后元素数量有 3 个后则需要调整中间元素向上,来保持树平衡。与之对应的红黑树则需要调整颜色,来保证红黑树的平衡规则,具体参考如下;

 

旋转+染色运用案例

首先从左侧开始,是一个按照顺序插入生产出来的红黑树,插入顺序;7、2、 8、1、4、3、5

 α,向目前红黑树插入元素 6,插入后右下角有三个红色节点;3、5、6。

β,因为右下角满足染色条件,变换后;黑色节点(3、5)、红色节点(4、6)。

γ,之后看被红色连线链接的节点 7、4、2,最小节点在中间,左旋平衡树结构。

δ,左旋完成后,红色链接线的 7、4、2 为做倾顺序节点,因此需要做右旋操作。

ε,左旋、右旋,调整完成后,又满足了染色操作。到此恢复红黑树平衡。

注意,所有连接红色节点的,都是是红色线。以此与 2-3 树做对应。

删除操作

1. 删除子叶红色节点

红色子叶节点的删除并不会破坏树平衡,也不影响树高,所以直接删除即可,如下;

2.删除左侧节点

被删节点兄弟为黑色&含右子节点

 被删节点兄弟为黑色&含左子节点

 

被删节点兄弟为黑色&含双子节点(红)

被删节点兄弟为黑色&不含子节点

 

被删节点兄弟为黑色&含双黑节点(黑)

 

3.删除右侧节点

被删节点兄弟为黑色&含左子节点

 

被删节点兄弟为黑色&含右子节点

 

被删节点兄弟为黑色&含双子节点(红)

 

被删节点兄弟为黑色&不含子节点

被删节点兄弟为黑色&含双黑节点(黑)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值