Treap 基本ADT

来源:互联网 发布:java nexttoken 编辑:程序博客网 时间:2024/05/18 02:05

因为计算几何的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;}


0 0
原创粉丝点击