算法导论笔记 红黑树(1)

//算法

//  RB_tree.cppspa

//  笔记it

//二叉树

//  Created by fam on 15/3/17.margin

//top

//红黑树




//RB_tree时间

{co

    /*算法导论

        RB_tree概述:

        RB_tree是一种平衡二叉树,必须知足4个条件:

        1:每一个节点不是红色就是黑色

        2:根节点为黑色(叶子节点也为黑色)

        3:若是节点为红,其子节点必须为黑(也就是说不能同时出现两个红色节点)

        4:每一个节点 到达叶子节点的 每一条路径 必须拥有一样数量的 黑色节点 (这个数量(不包含本身)称之为黑高)

        

        在平衡RB_tree的时候能够先从上到下进行调整,每次遇到一个节点的子节点都是红色的

        就把这个节点改为红色,把子节点改为黑色。 若是该节点的父节点也是红色,

        就作一次(也有多是两次)旋转。

        这样作的目的是,尽量让红色节点上移,这样红色节点就会变少,此时插入黑色须要调整的就少了

     

     

    */

    

    

    //一下是算法导论中的红黑树笔记:

    

    

    //哨兵

    /*

        哨兵:

        为了方便处理红黑树中的边界条件,使用一个哨兵(T.nil)来表示叶子节点,T.nil拥有和普通节点同样的属性

        color属性为black,其余属性能够为任意值,这样能够把叶子节点视为一个普通的节点,可是为了节省空间,能够把

        全部叶子节点和根节点的父节点设置为同一个哨兵(T.nil)

     

    */

    

    

    //红黑树的高度

    /*

        树高h最大为2lg(n+1):

        先用概括法证实每一个x节点至少包含 2^(bh(x))-1 个子节点(bh==blackheight)

        1:若是bh(x)0,也就是xT.nilx拥有 2^(0)-1 == 0个子节点

        2:一个x的子节点的黑高为 bh(x):{x为红色} bh(x-1):{x为黑色}

        因此x拥有的自节点个数至少为 2*2^(bh(x)-1)-1 == 2^(bh(x))-1

        由此得证:每一个x节点至少包含 2^(bh(x))-1 个子节点

        

        根据第3个条件,一条路径至少包含一半的黑色节点 -->>

        bh(x)>=h/2 -->>  n>=2^(h/2)-1 -->> lg(n+1) >=h/2 

        -->> h<=2lg(n+1) (lg表示log2)

        得证树高最大为2lg(n+1)

        因此RB_tree全部操做时间为O(lg(n));

     

     

    */

    

    //左旋转操做

    

    //x进行左旋转

    LEFT-ROTATE(T,x)

    {

        y=x.right;          //拿到x的右儿子

        x.right=y.left;     //已知的有 x.right==y y.p==x 因此能够先改变这两个值

        if(y.left!=T.nil)   //若是y的左儿子为nil就不须要给这个nil赋值一个parent

            y.left.p=x;

        

        y.p=x.p;            //剩下的已知只有y.p  因此找到旋转后的y.p就是如今的x.p

        if(x.p == T.nil)    //若是x.pnil,表明x时根节点,因此旋转后y就是根节点

            T.root=y;

        else if(x=x.p.left) //判断x是的父节点的左儿子仍是右儿子

        {

            x.p.left=y;

        }

        else

        {

            x.p.right=y;

        }

        y.left=x;           //y.left用完了(以前给x.right赋值完就能够存放x),拿来存放旋转后的值(x);

        x.p=y;              //x.p用完了,能够拿来存放旋转后的值(y)

    }

相关文章
相关标签/搜索