//转载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;
}