Splay伸展平衡树

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<iostream>  
#include<algorithm>  
#define For(i,j,k) for (i=j;i<=k;i++)  
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;  
  
int random(){  
    return (int)rand()*1.0/32767*2147483647;  
}  
void left(struct node *u,struct node *v){  
    if (v==h)  
        h=u;  
    v->r=u->l;  
    if (u->l!=NULL)  
        u->l->f=v;  
    u->f=v->f;  
    if (v->f!=NULL)  
        if (v->f->l==v)  
            v->f->l=u;  
        else v->f->r=u;  
    v->f=u;  
    u->l=v;  
}  
void right(struct node *u,struct node *v){  
    if (v==h)  
        h=u;  
    v->l=u->r;  
    if (u->r!=NULL)  
        u->r->f=v;  
    u->f=v->f;  
    if (v->f!=NULL)  
        if (v->f->l==v)  
            v->f->l=u;  
        else v->f->r=u;  
    v->f=u;  
    u->r=v;  
}  
void ll(struct node *x,struct node *y,struct node *z){  
    right(y,z);  
    right(x,y);  
}  
void rr(struct node *x,struct node *y,struct node *z){  
    left(y,z);  
    left(x,y);  
}  
void lr(struct node *x,struct node *y,struct node *z){  
    left(x,y);  
    right(x,z);  
}  
void rl(struct node *x,struct node *y,struct node *z){  
    right(x,y);  
    left(x,z);  
}  
void insert(struct node *t,int k){  
    if (k<t->x){  
        if (t->l==NULL){  
            p=new node;  
            p->x=k;  
            p->w=random();  
            p->f=t;  
            t->l=p;  
            while (p->f!=NULL){  
                if (p->f->f==NULL)  
                    if (p==p->f->l)  
                        right(p,p->f);  
                    else left(p,p->f);  
                else  
                    if (p->f->f->l!=NULL && p->f->f->l->l==p)  
                        ll(p,p->f,p->f->f);  
                    else if (p->f->f->l!=NULL && p->f->f->l->r==p)  
                        lr(p,p->f,p->f->f);  
                    else if (p->f->f->r!=NULL && p->f->f->r->r==p)  
                        rr(p,p->f,p->f->f);  
                    else if (p->f->f->r!=NULL && p->f->f->r->l==p)  
                        rl(p,p->f,p->f->f);  
            }  
        }else insert(t->l,k);  
    }else{  
        if (t->r==NULL){  
            p=new node;  
            p->x=k;  
            p->w=random();  
            p->f=t;  
            t->r=p;  
            while (p->f!=NULL){  
                if (p->f->f==NULL)  
                    if (p==p->f->l)  
                        right(p,p->f);  
                    else left(p,p->f);  
                else  
                    if (p->f->f->l!=NULL && p->f->f->l->l==p)  
                        ll(p,p->f,p->f->f);  
                    else if (p->f->f->l!=NULL && p->f->f->l->r==p)  
                        lr(p,p->f,p->f->f);  
                    else if (p->f->f->r!=NULL && p->f->f->r->r==p)  
                        rr(p,p->f,p->f->f);  
                    else if (p->f->f->r!=NULL && p->f->f->r->l==p)  
                        rl(p,p->f,p->f->f);  
            }  
        }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);  
}  
void safe_out(struct node *t){  
    struct node *stack[101000];  
    int top=0;  
    while (1){  
        if (t){  
            stack[++top]=t;  
            t=t->l;  
        }else{  
            t=stack[top];  
            printf("%d ",t->x);  
            top--;  
            t=t->r;  
        }  
        if (top==0 && t==NULL)  
            break;  
    }  
}  
  
int main(){  
    int i,j,k,m,n;  
    scanf("%d",&n);  
    scanf("%d",&k);  
    h=new node;  
    h->x=k;  
    h->w=random();  
    For(i,2,n){  
        scanf("%d",&k);  
        insert(h,k);  
    }  
    safe_out(h);  
    return 0;  
}


 

你可能感兴趣的:(Splay伸展平衡树)