Treap平衡树

来源:互联网 发布:linux 没有home目录 编辑:程序博客网 时间:2024/06/01 08:18

转自:http://blog.csdn.net/sxy_cnyali/article/details/50412629

程序:

#include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<iostream>  #include<algorithm>  using namespace std;    const int dmax=101000;  struct node{      int x,w;      struct node *f,*l,*r;      node(){          f=l=r=NULL;          x=w=0;      }  };  struct node *h,*p,*q;    void right(struct node *x,struct node *y){      if (y==h)          h=x;      y->l=x->r;      if (x->r!=NULL)          x->r->f=y;      x->f=y->f;      if (y->f!=NULL){          if (y->f->l==y)              y->f->l=x;          else y->f->r=x;      }      y->f=x;      x->r=y;  }  void left(struct node *x,struct node *y){      if (y==h)          h=x;      y->r=x->l;      if (x->l!=NULL)          x->l->f=y;      x->f=y->f;      if (y->f!=NULL){          if (y->f->l==y)              y->f->l=x;          else y->f->r=x;      }      y->f=x;      x->l=y;  }    void insert(struct node *t,int k){      if (k<t->x){          if (t->l==NULL){              p=new node;              p->x=k;              p->w=(int)rand()*1.0/32767*2147483647;              p->f=t;              t->l=p;              if (p->f!=NULL)                  while (p->w<p->f->w){                      if (p==p->f->l)                          right(p,p->f);                      else                          left(p,p->f);                      if (p->f==NULL)                          break;                  }          }else insert(t->l,k);      }else{          if (t->r==NULL){              p=new node;              p->x=k;              p->w=(int)rand()*1.0/32767*2147483647;              p->f=t;              t->r=p;              if (p->f!=NULL)                  while (p->w<p->f->w){                      if (p==p->f->l)                          right(p,p->f);                      else                          left(p,p->f);                      if (p->f==NULL)                          break;                  }          }else insert(t->r,k);      }  }  void out(struct node *t){      if (t->l!=NULL) out(t->l);      printf("%d ",t->x);      if (t->r!=NULL) out(t->r);  }    int main(){      srand(18213);      int i,j,k,m,n;      scanf("%d",&n);      h=new node;      scanf("%d",&k);      h->x=k;      h->w=(int)rand()*1.0/32767*2147483647;      for (i=2;i<=n;i++){          scanf("%d",&k);          insert(h,k);      }      out(h);      return 0;  }  


1 0
原创粉丝点击