Treap平衡树

转自: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;  
}  


你可能感兴趣的:(C语言,图论,treap,平衡树)