Splay的一些操作

查找find操作


从根节点开始,左侧都比他小,右侧都比他大, 
所以只需要相应的往左/右递归 
如果当前位置的val已经是要查找的数 
那么直接把他Splay到根节点,方便接下来的操作 
类似于二分查找, 
所以时间复杂度O(logn)

inline void find(int x)//查找x的位置,并将其旋转到根节点
{
    int u=root;
    if(!u)return;//树空
    while(t[u].ch[x>t[u].val]&&x!=t[u].val)//当存在儿子并且当前位置的值不等于x
        u=t[u].ch[x>t[u].val];//跳转到儿子,查找x的父节点
    splay(u,0);//把当前位置旋转到根节点
}

下一个Insert操作 


往Splay中插入一个数 
类似于Find操作,只是如果是已经存在的数,就可以直接在查找到的节点的进行计数 
如果不存在,在递归的查找过程中,会找到他的父节点的位置, 
然后就会发现底下没有啦。。。 
所以这个时候新建一个节点就可以了

inline void insert(int x)//插入x
{
    int u=root,ff=0;//当前位置u,u的父节点ff
    while(u&&t[u].val!=x)//当u存在并且没有移动到当前的值
    {
        ff=u;//向下u的儿子,父节点变为u
        u=t[u].ch[x>t[u].val];//大于当前位置则向右找,否则向左找
    }
    if(u)//存在这个值的位置
        t[u].cnt++;//增加一个数
    else//不存在这个数字,要新建一个节点来存放
    {
        u=++tot;//新节点的位置
        if(ff)//如果父节点非根
            t[ff].ch[x>t[ff].val]=u;
        t[u].ch[0]=t[u].ch[1]=0;//不存在儿子
        t[tot].ff=ff;//父节点
        t[tot].val=x;//值
        t[tot].cnt=1;//数量
        t[tot].size=1;//大小
    }
    splay(u,0);//把当前位置移到根,保证结构的平衡
}

前驱/后继操作Next 


首先就要执行Find操作 
把要查找的数弄到根节点 
然后,以前驱为例 
先确定前驱比他小,所以在左子树上 
然后他的前驱是左子树中最大的值 
所以一直跳右结点,直到没有为止 
找后继反过来就行了

inline int Next(int x,int f)//查找x的前驱(0)或者后继(1)
{
    find(x);
    int u=root;//根节点,此时x的父节点(存在的话)就是根节点
    if(t[u].val>x&&f)return u;//如果当前节点的值大于x并且要查找的是后继
    if(t[u].val<x&&!f)return u;//如果当前节点的值小于x并且要查找的是前驱
    u=t[u].ch[f];//查找后继的话在右儿子上找,前驱在左儿子上找
    while(t[u].ch[f^1])u=t[u].ch[f^1];//要反着跳转,否则会越来越大(越来越小)
    return u;//返回位置
}

删除操作 


现在就很简单啦 
首先找到这个数的前驱,把他Splay到根节点 
然后找到这个数后继,把他旋转到前驱的底下 
比前驱大的数是后继,在右子树 
比后继小的且比前驱大的有且仅有当前数 
在后继的左子树上面, 
因此直接把当前根节点的右儿子的左儿子删掉就可以啦

inline void Delete(int x)//删除x
{
    int last=Next(x,0);//查找x的前驱
    int next=Next(x,1);//查找x的后继
    splay(last,0);splay(next,last);
    //将前驱旋转到根节点,后继旋转到根节点下面
    //很明显,此时后继是前驱的右儿子,x是后继的左儿子,并且x是叶子节点
    int del=t[next].ch[0];//后继的左儿子
    if(t[del].cnt>1)//如果超过一个
    {
        t[del].cnt--;//直接减少一个
        splay(del,0);//旋转
    }
    else
        t[next].ch[0]=0;//这个节点直接丢掉(不存在了)
}

猜你喜欢

转载自blog.csdn.net/sslz_fsy/article/details/82078755