锦标赛程序的优先队列的删除

//转载c算法,其中在数据结构中加一个标志位,是用于删除遍历后使用

struct node

{

   Item data;

   Link l,r;

   int flag;

};

Link NEW(Item aData)

{

   Link x = malloc(sizeof(*x));

   if (!x)

    {

       return NULL;

    }

    x->data = aData;

    x->flag =0;

    x->l =NULL;

    x->r =NULL;

   return x;

}


Link max(Item a[],int l,int r)

{

   int m = (l+r)/2;

   Item u,v;

   Link x = NEW(a[m]);

    

   if (l == r)

    {

       return x;

    }

    

    x->l =max(a, l, m);

    x->r =max(a, m+1, r);

    u = x->l->data;

    v = x->r->data;

   if (u > v)

    {

        x->data = u;

    }

   else

    {

        x->data = v;

    }

   return x;

}





//原创

Link deleteMax(Link pq,Link root)

{

    if (!pq)

    {

        return pq;

    }


    if ((pq->l)&&(pq->data == pq->l->data))

    {

        pq->flag = 1;

        deleteMax(pq->l,root);

    }

    if ((pq->r)&&(pq->data == pq->r->data))

    {

        pq->flag = 1;

        deleteMax(pq->r,root);

    }

    if (pq&&((pq->l)||(pq->r)))

    {

        if (pq->data == pq->l->data)

        {

            pq->data = pq->r->data;

            Link l = pq->l;

            Link r = pq->r;

            if ((r->r == NULL)&&(r->l == NULL))

            {

                free(r);

                 r = NULL;

            }

            free(l);

            l = NULL;

           

        }

        else if (pq->data == pq->r->data)

        {

            pq->data = pq->l->data;

            Link l = pq->l;

            Link r = pq->r;

            if ((l->l == NULL)&&(l->r == NULL))

            {

                free(l);

                l = NULL;

            }

            free(r);

            r = NULL;

        }

        else

        {

            if (pq->l->flag)

            {

                pq->l->flag = 0;

                pq->data = pq->l->data;

            }

            else  if (pq->r->flag)

            {

                pq->r->flag = 0;

                pq->data = pq->r->data;

            }

            if (pq == root)

            {

                pq->flag = 0;

                if ((pq->l)&&(pq->r))

                {

                    if (pq->l->data > pq->r->data)

                    {

                        pq->data =  pq->l->data;

                    }

                    else

                    {

                        pq->data = pq->r->data;

                    }

                }

            }

        }

    }

    return pq;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值