您的位置:首页 > 其它

POJ 3481 treap

2014-09-11 20:29 309 查看
这是利用treap写的二叉排序树,只要理解其中旋转能够改变树的左右子树平衡度,即高度之差,差不多就能掌握treap树的要领了。

相对于其他高级BST,treap树实现应该算最简单了,利用的是随机树产生的理论的二叉排序树时间复杂度为O(nlgn)来实现,具体证明 算法导论 中有。

推荐NOCOW中的讲解,关于二叉排序树相当完整!

treap动画展示:http://www.ibr.cs.tu-bs.de/courses/ss98/audii/applets/BST/Treap-Example.html

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <ctime>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define INF 0x3f3f3f3f
#define MAXN 100005

using namespace std;

int cnt=1, rt=0;

struct Tree{
int key, num, pri, son[2];
void set(int _x, int _y, int _z){
key=_x;
num=_y;
pri=_z;
son[0]=son[1]=0;
}
}T[MAXN];

void rotate(int &x, int p) //1 右旋 0 左旋
{
int y=T[x].son[!p];
T[x].son[!p]=T[y].son[p];
T[y].son[p]=x;
x=y;
}

void ins(int &x, int key, int num)
{
if(x == 0)
T[x=cnt++].set(key, num, rand());
else
{
int p=key < T[x].key;
ins(T[x].son[!p], key, num);
if(T[x].pri < T[T[x].son[!p]].pri) rotate(x, p);
}
}

void del(int &x, int key)
{
if(T[x].key == key)
{
if(T[x].son[0] && T[x].son[1])
{
int p=T[T[x].son[0]].pri > T[T[x].son[1]].pri;
rotate(x, p);
del(T[x].son[p], key);
}
else
{
if(!T[x].son[0]) x=T[x].son[1];
else x=T[x].son[0];
}
}
else
{
int p=T[x].key > key;
del(T[x].son[!p], key);
}
}

int get(int x, int p)
{
while(T[x].son[p])
x=T[x].son[p];
return x;
}

int main ()
{
srand(time(NULL));
int p, key, num, x;
while(scanf("%d", &p) && p)
{
switch (p)
{
case 1:
scanf("%d%d", &num, &key);
ins(rt, key, num);
break;
case 2:
x=get(rt, 1);
if(x)
{
printf("%d\n",T[x].num);
del(rt, T[x].key);
}
else
printf("0\n");
break;
case 3:
x=get(rt, 0);
if(x)
{
printf("%d\n",T[x].num);
del(rt, T[x].key);
}
else
printf("0\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: