如果对红黑树还不了解的,建议看上一篇博客。
https://blog.csdn.net/weixin_37909391/article/details/112252930
首先回顾以下红黑树的性质:
- 节点必须是红色或者黑色。
- 根节点必须是黑色。
- 叶节点(NIL)必须是黑色(NIL节点无数据,是空节点)。
- 红色节点不能连续。
- 从任一节点出发到其每个叶子节点的路径,黑色节点的数量必须相等。
左旋转
确定目标节点,图中就是E和S,这2个节点相对原来位置的左右边来说,都是向左边移动。
其实左旋就是
1.S节点要向左边移动,就先把左边节点断开
2.S节点去到E点位置(相对原来位置更左了),各条线不断开
3.E点被S点占据了,E点移动下来(相对原来位置更左了),各条线不断开
4.断开的子树跟节点连接到E上
同理,右旋动态图如下:
以上就是左右旋转的介绍,下面总结红黑树新增导致红黑树需要重新平衡的需要旋转和变色的情况
1、N为根节点,N变黑色
2、N.P(新增节点父节点)为黑色,无需改动
3、 N.P为红色,N.U红色(PU变黑,G变红,如果还不满足红黑色,把G当重新安装1,2,3,4处理)
4、N.P为红,C.U为黑色或者为空节点,分情况讨论
1)NPG三点一线,以PG为目标进行旋转,P移动到G,看是左旋还是右旋;PG变色
2)NPG不在一线,以NP为目标旋转,看左旋还是右旋;按照4.1处理。
例子可以拿 https://blog.csdn.net/weixin_37909391/article/details/112252930 中的5种情况和其他例子按照上面规则旋转