Splay树的基本写法

//node为节点类型,其中ch[0]表示左结点指针,ch[1]表示右节点指针
//pre表示指向父亲的指针

void Rotate(node *x,int c) //旋转操作,c=0表示左旋,c=1表示右旋
{
    node *y= x->pre;
    Push_Down(y), Push_Down(x);
    //先将Y节点的标记乡下传递(因为Y在上面),再把X的标记向下传递
    y->ch[!c]=x->ch[c];
    if (x->ch[c] != NULL) x->ch[c]->pre = y;
    x->pre =y->pre;
    if (y->pre !=NULL)
        if (y->pre->ch[0] == y) y->pre->ch[0]=x;
        else y->pre->ch[1]=x;
    x->ch[c]=y;
    y->pre=x;
    Update(y);//维护Y节点
    if (y==root) root = x;//root表示整棵树的根节点
}

void Splay(node *x,int *f)//Splay操作,表示把节点x转到节点f的下面
{
    for (Push_Down(x);x->pre!=f ; )//一开始就将x的标记下传
        if (x->pre->pre==f) //父节点的父亲即为f,执行单旋转
            if (x->pre->ch[0]==x) Rotate(x,1);
            else Rotate(x,0);
        else {
            node *y=x->pre,*z=y->pre;
            if (z->ch[0]==y)
                if (y->ch[0]==x)
                    Rotate(y,1),Rotate(x,1);//一字型旋转
                else 
                    Rotate(x,0),Rotate(x,1);//之字形旋转
            else 
                if (y->ch[1]==x)
                    Rotate(y,0),Rotate(x,0);//一字型旋转
                else 
                    Rotate(x,1),Rotate(x,0);//之字形旋转
        }
    Update(x);//最后再维护x节点
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值