平衡树

Posted bakacirno

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平衡树相关的知识,希望对你有一定的参考价值。

新学了无旋 treap,感觉特别好用,贴个模板在这里,之后再来补一下理解和注释。

模板题

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXN 100010
using namespace std;
int n;

struct FhqTree{
    int L[MAXN],R[MAXN],val[MAXN],key[MAXN],siz[MAXN];
    int cnt,root;
    
    int newnode(int data){
        val[++cnt]=data;
        key[cnt]=rand();
        siz[cnt]=1;
        return cnt;
    }

    void update(int now){
        siz[now]=siz[L[now]]+siz[R[now]]+1;
    }

    void split(int now,int data,int &x,int &y){
        if(!now) x=y=0;
        else{
            if(val[now]<=data){
                x=now;
                split(R[now],data,R[now],y);
            } 
            else{
                y=now;
                split(L[now],data,x,L[now]);
            }
            update(now);
        }
    }

    int merge(int x,int y){
        if(!x||!y) return x+y;
        if(key[x]>key[y]){
            R[x]=merge(R[x],y);
            update(x);
            return x;
        }
        else{
            L[y]=merge(x,L[y]);
            update(y);
            return y;
        }
    }

    int x,y,z;

    void insert(int data){
        split(root,data,x,y);
        root=merge(merge(x,newnode(data)),y);
    }

    void erease(int data){
        split(root,data,x,z);
        split(x,data-1,x,y);
        y=merge(L[y],R[y]);
        root=merge(merge(x,y),z);
    }

    void getrank(int data){
        split(root,data-1,x,y);
        printf("%d
",siz[x]+1);
        root=merge(x,y);
    }

    void getnum(int rank){
        int now=root;
        while(now){
            if(siz[L[now]]+1==rank) break;
            else if(siz[L[now]]>=rank) now=L[now];
            else rank-=siz[L[now]]+1,now=R[now];
        }
        printf("%d
",val[now]);
    }

    void pre(int data){
        split(root,data-1,x,y);
        int now=x;
        while(R[now]) now=R[now];
        printf("%d
",val[now]);
        root=merge(x,y);
    }

    void nxt(int data){
        split(root,data,x,y);
        int now=y;
        while(L[now]) now=L[now];
        printf("%d
",val[now]);
        root=merge(x,y);
    }
}fhq;

int main(){
    srand(time(0));
    scanf("%d",&n);
    int opt,x;
    while(n--){
        scanf("%d%d",&opt,&x);
        if(opt==1) fhq.insert(x);
        else if(opt==2) fhq.erease(x);
        else if(opt==3) fhq.getrank(x);
        else if(opt==4) fhq.getnum(x);
        else if(opt==5) fhq.pre(x);
        else if(opt==6) fhq.nxt(x);
    }
    return 0;
}

 

以上是关于平衡树的主要内容,如果未能解决你的问题,请参考以下文章

判断一颗二叉树是否为二叉平衡树 python 代码

编程算法 - 推断二叉树是不是平衡树 代码(C)

平衡二叉树平衡调整代码

平衡树代码总结

树--07---二叉树--04--平衡二叉树(AVL树)

求数据结构算法平衡二叉树实现代码