关于 FHQ treap 一种插入元素方式的正确性
查看原帖
关于 FHQ treap 一种插入元素方式的正确性
743447
RegisterIntOfficial楼主2023/3/22 21:12

今天帮朋友调代码。他的平衡树在 5×1055\times10^5 量级的随机数据下,树高达到了 20002000 以上。原因是他用了一个比较奇怪的插入:

void split(int rt,int&x,int&y,int k){
    if(!rt)return (void)(x=y=0);
    if(tree[rt].v<k)x=rt,split(tree[x].r,tree[x].r,y,k);
    else y=rt,split(tree[y].l,x,tree[y].l,k);
    pushup(rt);
}
void _insert(int& rt, int x) {
    if (!rt)
        rt = x;
    else if (tree[x].w > tree[rt].w)
        split(rt, tree[x].l, tree[x].r, tree[x].v), rt = x;
    else if (tree[x].v < tree[rt].v)
        _insert(tree[rt].l, x);
    else
        _insert(tree[rt].r, x);
    pushup(rt);
}

更换为普通 fhq 的 merge 即可维持树平衡。在这里想求助,这种方法是否正确?

2023/3/22 21:12
加载中...