红黑树的性质
1、每个节点不是红色就是黑色
2、不可能有连在一起的红色节点(这个性质后面要用,其他性质看一遍就够了)
3、根节点都是黑色的(什么是根节点:父节点为null,或者入度为0)
4、每个红色节点的两个子节点都是黑色。叶子节点都是黑色(每个节点最后都是有NL节点,只是没有画出来)
画出来就是这个下面的样子
先来熟悉一下左旋操作:
只看E和S,就是将S移动上去,E点移动下来,再将S的左节点变成E点的右节点
左旋看懂了,再来看看右旋操作:
先看总结的文字:
后面会一行一行的演示,不用怕
首先明确:旋转和颜色变化:所有插入的点默认为红色,比如下面要插入的数字 6
开始演示 :
比如现在我们有这么一个红黑树,就是大的数字在右边,小的在左边,插入这些数字后,形成这么一张二叉树
我们想要插入 6 ,第一步,插入的所有点为红色,找到位置,不难判断出位置在7 的左边
此时满足情况:当前节点的父亲是红色,且它的叔叔节点也是红色
步骤:① 把父节点设为黑色 ②把叔叔也设为黑色 ③ 把祖父设为红色(爷爷)
④ 把指针定义到祖父(爷爷)节点设为当前要操作分析的点的变换规则
左旋:(把眼睛盯着上面的红色 5 和 12根据左旋图进行想象,结果就是下面的图)当前父节点是红色,叔叔节点是黑色的时候,且当前的节点是右子树(左旋的三个条件,这里的12节点都满足条件)。左旋以父节点作为左旋
这里 的 S 是12,E是 5,旋转之后,要将12的左节点交给5的右节点
左旋之后的结果:
到这里,还是不满足红黑树的性质,,两个红色的节点依然相连
右旋:当前节点(5)的父节点(12)是红色,叔叔节点是黑色(13),且当前节点为左子树,进行右旋
注意:这里和左旋不一样,这里使用的指针,上面已经画出来了,使用的是爷爷节点。 ps: 左旋只要使用两个红色节点之间的线旋转,右旋使用爷爷这个点来旋转
注意:右旋比左旋还多了一步,需要变颜色,父节点(12)变成黑色,爷爷(19)节点变成红色,结果见下面二图,12的右子树变成19的左子树
自己编一个口诀:
父红 叔红 父叔爷变色
父红 叔黑 右子树 左旋
父红 叔黑 左子树 右旋,父爷变色
现在再来看看这段文字是不是清楚多了
红黑树的源码:
请大家在评论区展示