首页 > 代码库 > POJ 3481
POJ 3481
这是利用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 100005using 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;}
POJ 3481
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。