红黑树学习总结1(旋转、插入)

红黑树学习总结1

红黑树,R-B Tree,像是别的平衡树那样,学起来比较费劲
R-B Tree
引用百度百科
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

旋转操作

- 左旋:把X向左儿子方向旋转

- 右旋:把X向右儿子方向旋转

这里不予讨论,但可以发现,两个操作是可以合并的。
可以把旋转操作换成一种把X向祖先方向移动的操作


void roup(int x)
{
    int father=no[x].father,l=no[x].lson,r=no[x].rson;
    int gfather=no[father].father;

    no[x].father=gfather;no[father].father=x;

    if(no[gfather].lson==father) no[gfather].lson=x;
    else no[gfather].rson=x;

    if(no[father].lson==x) no[x].rson=father,no[father].lson=r,no[r].father=father;
    else no[x].lson=father,no[father].rson=l,no[l].father=father;
}

插入

根据红黑树性质5

- 性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

新节点插入,若为黑色,必须要大量的调整,红色相对简单,
维护
(X是当前节点,F是爸爸节点,GF是爷爷节点,U是叔叔节点,B是哥哥节点)
最后一幅图只是解决了部分情况,要以GF为起点继续调整,直到调整到根节点或者
总结起来是

- 1 三点一线转爸爸,把爸爸的颜色与爷爷的颜色对调

- 2 不共线,自己转两圈,颜色与爷爷对调

- 3 叔叔是红的,爷爷与爸爸、叔叔对调颜色

这里演示一下

这里写图片描述
当前插入节点6
爸爸是红色需要调整
这里写图片描述
发现符合情况3,对调颜色
这里写图片描述
以点10为起点继续调整
这里写图片描述
符合情况2,先转一转
这里写图片描述
对调颜色,又转一转
这里写图片描述
这里写图片描述
发现已经到了根节点,结束

- 注意所有的调整最后都要把根节点染黑

猜你喜欢

转载自blog.csdn.net/cjy_12/article/details/81805106