静态数组Treap(用随机数维护的二叉搜索树)

来源:互联网 发布:淘口令算淘宝客吗 编辑:程序博客网 时间:2024/05/02 04:16
    #include<stdio.h>      #include<stdlib.h>      struct node{          int x,w,h,r,l;      };      struct node a[100001];      int e,root=1;            void rotate_left(int v,int u){          int t=a[u].h;          a[u].r=a[v].l;a[a[v].l].h=u;          a[u].h=v;a[v].l=u;          a[v].h=t;          if(a[t].l==u)a[t].l=v;          else a[t].r=v;        }            void rotate_right(int v,int u){          int t=a[u].h;          a[u].l=a[v].r;a[a[v].r].h=u;          a[u].h=v;a[v].r=u;          a[v].h=t;          if(a[t].l==u)a[t].l=v;          else a[t].r=v;        }            void insert(int v,int u){          int p;          if(!v)return;          if(u>a[v].x){              if(!a[v].r){                  a[++e].x=u;                  a[e].w=rand();                  a[e].h=v;                  a[v].r=e;                  p=e;                  while(a[p].h && a[p].w<=a[a[p].h].w){                      if(p==a[a[p].h].r)                          rotate_left(p,a[p].h);                      else    rotate_right(p,a[p].h);                  }                  if(a[p].h==0)root=p;              }else insert(a[v].r,u);                   }else{              if(!a[v].l){                  a[++e].x=u;                  a[e].w=rand();                  a[e].h=v;                  a[v].l=e;                  p=e;                  while(a[p].h && a[p].w<=a[a[p].h].w){                      if(p==a[a[p].h].r)                          rotate_left(p,a[p].h);                      else    rotate_right(p,a[p].h);                  }                  if(a[p].h==0)root=p;              }else insert(a[v].l,u);           }      }      void out(int s){          if(!s)return;          out(a[s].l);          printf("%d ",a[s].x);          out(a[s].r);      }      int main(){          int i,j,k,m,n;          scanf("%d",&n);          scanf("%d",&k);          srand(3221);          a[1].x=k;e=1;          a[1].w=rand();          for(i=2;i<=n;i++){              scanf("%d",&k);              insert(root,k);          }          out(root);          return 0;      }  


0 0
原创粉丝点击