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;
}
#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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性