• 自己yy的Splay


    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    
    const int maxn=1e5+7;
    struct Node{
        int val,rev,max,min;
        Node(){}
        Node(int _rev,int _max,int _min){
            this->rev=_rev;
            this->max=_max;
            this->min=_min;
        }
    };
    Node node[maxn];
    int son[maxn][2];//0 表示左儿子,1表示右儿子
    int father[maxn];
    bool Root[maxn];
    int ROOT;
    int tot;
    int n,q,op;
    struct bnode{
        int v,dep;
        bnode(int _v,int _dep){
            this->v=_v;
            this->dep=_dep;
        }
    };
    vector<int> DEEP[maxn];
    void init(){
        tot=1;
        ROOT=-1;
        memset(Root,0,sizeof(Root));
    }
    void BFS(){
        int i;
        for(i=0;i<maxn;++i){
            DEEP[i].clear();
        }
        if(ROOT==-1) return;
        queue<bnode> que;
        que.push(bnode(ROOT,1));
        while(!que.empty()){
            bnode t=que.front();
            que.pop();
            int v=t.v;
            int dep=t.dep;
            DEEP[dep].push_back(v);
            if(son[v][0]!=0) que.push(bnode(son[v][0],dep+1));
            if(son[v][1]!=0) que.push(bnode(son[v][1],dep+1));
        }
    }
    void print(){
        BFS();
        int cnt=0;
        for(int j=1;j<30;++j){
            if(DEEP[j].size()==0) break;
            cnt++;
            printf("DEEP:%d==>",j);
            for(int k=0;k<DEEP[j].size();++k){
                printf("%d ",DEEP[j][k]);
            }
            printf("
    ");
        }
        if(!cnt) printf("The Tree is Empty
    ");
    }
    void printVAL(){
        int i;
        for(i=1;i<tot;++i){
            printf("v%d val%d leftson%d rightson%d fa%d
    ",i,node[i].val,son[i][0],son[i][1],father[i]);
        }
    }
    void zig(int x){
        int y=father[x];
        int z=father[y];
        son[y][0]=son[x][1];
        if(son[x][1]!=0)
        father[son[x][1]]=y;
        son[x][1]=y;
        if(y!=0)
        father[y]=x;
        if(x!=0)
        father[x]=z;
        if(z!=-1&&z!=0){
            if(son[z][0]==y){
                son[z][0]=x;
            }
            else {
                son[z][1]=x;
            }
        }
        if(Root[y]){
            Root[x]=true;
            Root[y]=false;
            ROOT=x;
        }
    }
    void zag(int x){
        int y=father[x];
        int z=father[y];
        son[y][1]=son[x][0];
        if(son[x][0])
        father[son[x][0]]=y;
        son[x][0]=y;
        if(y)
        father[y]=x;
        if(x)
        father[x]=z;
        if(z!=-1&&z!=0){
            if(son[z][0]==y){    
                son[z][0]=x;
            }
            else{
                son[z][1]=x;
            }
        }
        if(Root[y]){
            Root[x]=true;
            Root[y]=false;
            ROOT=x;
        }
    }
    void zigzig(int x){
        int y=father[x];
        zig(y);
        zig(x);
    }
    void zagzag(int x){
        int y=father[x];
        zag(y);
        zag(x);
    }
    void zigzag(int x){
        zig(x);zag(x);
    }
    void zagzig(int x){
        zag(x);zig(x);
    }
    void Splay(int x){
        while(!Root[x]){
            int y=father[x];
            int z=father[y];
            if(z!=-1&&!Root[z]){
                if(son[z][0]==y){
                    if(son[y][0]==x){
                        zigzig(x);
                    }
                    else{
                        zag(x);zig(x);
                    }
                }
                if(son[z][1]==y){
                    if(son[y][1]==x){
                        zagzag(x);
                    }
                    else{
                        zig(x);zag(x);
                    }
                }
            }
            else if(!Root[y]){
                if(son[y][0]==x){
                    zig(x);
                }
                else{
                    zag(x);
                }
            }
            else {
                if(son[y][0]==x){
                    zig(x);
                }
                else {
                    zag(x);
                }
            }
            // printf("==========
    ");
            // print();
            // printVAL();
        }
    }
    
    int insert(int rt,int x){
        if(rt==-1){
            rt=tot;
            node[rt].val=x;
            father[rt]=-1;
            Root[rt]=true;
            ROOT=rt;
            ++tot;
            return tot-1;
        }
        if(x>node[rt].val){
            if(son[rt][1]==0){
                node[tot].val=x;
                father[tot]=rt;
                son[rt][1]=tot;
                tot++;
                return tot-1;
            }
            else insert(son[rt][1],x);
        }
        else if(x<node[rt].val){
            if(son[rt][0]==0){
                node[tot].val=x;
                father[tot]=rt;
                son[rt][0]=tot;
                tot++;
                return tot-1;
            }
            else insert(son[rt][0],x);
        }
    }
    
    int Search(int rt,int x){
        // printf("rt%d x%d
    ",rt,x);
        if(rt==-1){
            //Exception
        }
        if(x==node[rt].val){
            Splay(rt);
            return rt;
        }
        if(x>node[rt].val){
            if(son[rt][1]==0) return -1;
            return Search(son[rt][1],x);
        }
        else if(x<node[rt].val){
            if(son[rt][0]==0) return -1;
            return Search(son[rt][0],x);
        }
    }
    int SearchMax(int rt){
        if(son[rt][1]!=0){
            int x=son[rt][1];
            if(son[x][1]==0) return x;
            return SearchMax(son[x][1]);
        }
        return rt;
    }
    bool Delete(int x){
        int id=Search(ROOT,x);
        if(id==-1) return false;
        Splay(id);
        // print();
        // printf("=======
    ");
        int left=son[id][0];
        int right=son[id][1];
        son[id][0]=0;
        son[id][1]=0;
        if(left)
        father[left]=-1;
        if(right)
        father[right]=-1;
        Root[id]=false;
        if(left)
        Root[left]=true;
        if(left)
        ROOT=left;
        if(left){
            int lmx=SearchMax(left);
            // printf("left%d lmx%d
    ",left,lmx);
            // print();
            Splay(lmx);
            son[lmx][1]=right;
            father[right]=lmx;
            father[lmx]=-1;
            Root[id]=false;
            Root[lmx]=true;
            ROOT=lmx;
        }
        else if(right){
            father[right]=-1;
            Root[id]=false;
            Root[right]=true;
            ROOT=right;
        }
        else{
            init();
        }
        return true;
        // print();
    }
    int findRoot(){
    
    }
    
    
    void INSERT(int rt,int x){
        int id=insert(rt,x);
        printf("After insert
    ");
        print();
        Splay(id);
        printf("After Splay
    ");
        print();
    }
    int main(){
        init();
        scanf("%d%d",&n,&q);
        //少写一个%d
        int i,x;
        for(i=0;i<n;++i){
            scanf("%d",&x);
            INSERT(ROOT,x);
        }
        // printVAL();
        for(i=0;i<q;++i){
            scanf("%d",&op);
            if(op==1){
                scanf("%d",&x);
                INSERT(ROOT,x);
            }
            else if(op==2){
                scanf("%d",&x);
                int r=Delete(x);
                if(r){
                    printf("Delete %d successful
    ",x);
                }
                else printf("NOT FIND %d
    ",x);
            }
            else if(op==3){
                scanf("%d",&x);
                int id;
                // print();
                if((id=Search(ROOT,x))!=-1){
                    printf("%d FIND v is %d
    ",x,id);
                }
                else{
                    printf("%d NOT FIND
    ",x);
                }
            }
            else if(op==4){
                // printf("there22
    ");
                // printVAL();
                print();
            }
        }
        return 0;
    }
  • 相关阅读:
    requireJS的使用_API-1
    C# WebService动态调用
    Jquery 分页插件 Jquery Pagination
    脸识别API微软牛津项目
    从源码看Android中sqlite是怎么读DB的(转)
    浅谈SQL注入风险
    django
    java自动转型
    二叉搜索树(Binary Search Tree)--C语言描述(转)
    微软2014校园招聘笔试试题
  • 原文地址:https://www.cnblogs.com/linkzijun/p/6147001.html
Copyright © 2020-2023  润新知