从最大堆H中取出键值为最大的元素,并删除一个结点

从最大堆H中取出键值为最大的元素,并删除一个结点 

ElementType DeleteMax( MaxHeap H )
{
    /* 从最大堆H中取出键值为最大的元素,并删除一个结点 */
    int Parent, Child;
    ElementType MaxItem, temp;
    if ( IsEmpty(H) )
    {
        printf("最大堆已为空");
        return;
    }
    MaxItem = H->Elements[1]; /* 取出根结点最大值 */
    /* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */
    temp = H->Elements[H->Size--];
    for( Parent=1; Parent*2<=H->Size; Parent=Child )
    {
        Child = Parent * 2;//child指向根下层元素的左节点
        if( (Child!= H->Size) &&
                (H->Elements[Child] < H->Elements[Child+1]) )
            Child++; //Child指向左右子结点的较大者
        if( temp >= H->Elements[Child] ) break;//如果比较大的节点元素还大,就可以将temp元素放在树根
        else //移动temp元素到下一层
            H->Elements[Parent] = H->Elements[Child];//将儿子元素移到树根,temp再和下层元素作比较
    }
    H->Elements[Parent] = temp;
    return MaxItem;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值