因为计算几何的PA要求BBST和优先队列,就百度学习了一下Treap的用法。。。
这里要安利一下byvoid大牛的这篇论文,讲的非常好!
http://www.docin.com/p-456402313.html?qq-pf-to=pcqq.c2c
接下来就是把他的代码抄过来,然后一些小错误改一下。。。
struct Treap_Node
{
Treap_Node *lchild,*rchild;
int data,fix;
Treap_Node(int x=0):data(x),lchild(NULL),rchild(NULL)
{
fix=rand();
}
};
void Treap_left_rotate(Treap_Node* &a)
{
Treap_Node* b=a->rchild;
a->rchild=b->lchild;
b->lchild=a;
a=b;
}
void Treap_right_rotate(Treap_Node* &a)
{
Treap_Node* b=a->lchild;
a->lchild=b->rchild;
b->rchild=a;
a=b;
}
void Inorder_traverse(Treap_Node *p)
{
if(!p)
return ;
Inorder_traverse(p->lchild);
printf("%d\n",p->data);
Inorder_traverse(p->rchild);
}
Treap_Node* Treap_search(Treap_Node* p,int v)
{
if(p==NULL)
return NULL;
if(p->data==v)
return p;
else if(p->data<=v)
return Treap_search(p->lchild,v);
else
return Treap_search(p->rchild,v);
}
Treap_Node* Treap_insert(Treap_Node* &p,int v)
{
if(p==NULL)//we find the position and we do the insertion
{
p=new Treap_Node(v);
return p;
}
else if(v<=p->data)
{
Treap_insert(p->lchild,v);
if(p->lchild->fix<p->fix)
Treap_right_rotate(p);
}
else
{
Treap_insert(p->rchild,v);
if(p->rchild->fix<p->fix)
Treap_left_rotate(p);
}
}
bool Treap_delete(Treap_Node* &p,int v)//delete the Node with data v in subtree p
//return success or failure
{
if(p==NULL)
return false;
if(v==p->data)//we shall delete p
{
if(p->lchild==NULL||p->rchild==NULL)//leaf or only having a child
{
Treap_Node* temp=p;//for backup
if(p->rchild==NULL)
p=p->lchild;
else
p=p->rchild;
delete temp;
return true;
}
else//having both lchild and rchild
{
if(p->lchild->fix<p->rchild->fix)//rignt rotate
{
Treap_right_rotate(p);
Treap_delete(p->rchild,v);//go into the rchild subtree to do deletation
}
else
{
Treap_left_rotate(p);
Treap_delete(p->lchild,v);
}
}
}
else if(v<=p->data)
Treap_delete(p->lchild,v);
else
Treap_delete(p->rchild,v);
}
void Treap_destroy(Treap_Node* p)
{
if(p->lchild)
Treap_destroy(p->lchild);
if(p->rchild)
Treap_destroy(p->rchild);
delete p;
}