您的位置:首页 > 编程语言 > C语言/C++

Treap平衡树

2016-01-31 14:18 232 查看
转自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++