Treap 基本ADT

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值