Loading

「学习笔记」平衡树——splay 三

前文链接:

平衡树——\(splay\)
平衡树——\(splay\)

再补充两个操作,再补充两个操作,平衡树就暂时完结了。好耶ヾ(≧▽≦*)o
本文代码我没有测试过这两个操作目前对我来说太偏了,如果有错,欢迎在评论区指出!

十五、合并平衡树

合并条件,第二棵平衡树的所有结点的值都比第一棵平衡树的要大,将第一棵平衡树的最大节点的右孩子设为第二棵平衡树

int join(int x,int y)
{
    if(!x)    return y;
    if(!y)    return x;
    while(ch[x][1])    x=ch[x][1];
    splay(x,0);
    ch[x][1]=y;
    fa[y]=x;
    pushup(x);
    return x;
}

十六、分离平衡树

查找到节点,伸展到根节点,分离平衡树,这种做法是减少一个点的
如果不想减少点,那就插入一个虚拟点,从虚拟点分开,这样节点数不会发生改变,因为虚拟点本来就是多着的

void spilt(int id,int &a,int &b)
{
    find(id,0);
    a=ch[id][0];
    b=ch[id][1];
    cls(id);
    fa[a]=0;
    fa[b]=0;
}

完结撒花!q(≧▽≦q)

posted @ 2022-07-12 21:42  yi_fan0305  阅读(82)  评论(0编辑  收藏  举报