红黑树插入的旋转变色
红黑树性质:
1.每个结点不是红色就是黑色
2.根节点是黑色的
3.如果一个节点是红色的,则它的两个孩子结点是黑色的(任何路径没有连续的红色节点)
4.对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(每条路径上黑色节点的数量相等)
5.每个叶子结点都是黑色的(此处的叶子结点指的是空结点)
为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍
下面的符合要求吗?
都不符合条件4
我们插入时的节点都是按红色处理,这样有时会违反条件3,所以要变色and旋转处理
为什么不用黑色呢?
因为插入按黑色走,一定违反条件4,每条路径都要添加黑色,很难处理
下面讲的变色and旋转的关系类似于下面的图
1.p为黑色或nullptr,不用处理
2.p为红色
g一定为黑色,因为p为红色,条件3不能有连续的红色节点,若g为红色,那就违反条件3
_1.u为红色
变色:p和u变黑色,g变红色
这样处理后,原本违反条件3,经过调整后既不违反条件3,也保持了路径上黑色节点个数相同,
不过还要向上调整,看下面的情况
原本g为黑色,经过调整g变红色,那么g的前一个节点为红色也违反了条件3,要继续向上调整
_2.u为nullptr或黑色(都不需要向上调整)
_-1.u为nullptr
旋转and变色
单旋,p为黑色,g为红色,原本违反条件3的即不违反3还保持了黑色节点个数相同,同时也不用向上调整,因为p为根还是黑色,不管p上面的节点是黑色还是红色都不会违反条件3
双旋,c变黑色,g变红色,原本违反条件3的即不违反3还保持了黑色节点个数相同,同时也不用向上调整,因为c为根还是黑色,不管c上面的节点是黑色还是红色都不会违反条件3
_-1.u为黑色
这种情况下c一定为下面调整上来的红色
若c为新插入节点的红色,那么在插入之前就已经不是红黑树了,因为p路径只有一个黑节点,u路径有两个黑色节点,已经违反条件4
就像上面这个图,没有违反条件4,但违反了条件3,这时要旋转and变色
单旋and变色
p为黑色,g为红色,即解决了条件3还保持了条件4
双旋and变色
c变黑色,g变红色,即解决了条件3还保持了条件4。
以上就是红黑树旋转and变色的情况
最后要让根节点的颜色变黑色。