大顶堆和小顶堆的上滤和下滤

本文详细解析了二叉堆中的上滤和下滤算法,上滤用于在排序好的二叉堆中插入新节点,通过比较空穴与其父节点的值来维护堆序。下滤则用于在删除堆顶元素后,重新调整堆序,确保堆的性质得以保持。文章通过代码示例具体展示了大顶堆下滤的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:https://blog.youkuaiyun.com/DragonBark/article/details/79196459

总结一下:

上滤一般应用于在一个已经排序好的二叉堆中插入一个新节点。首先在堆末新建一个空间,称为空穴,然后比较穴的值和其父节点的值。从宏观上看,空穴会自下而上 地到达满足堆序的位置。

下滤一般应用于删除了堆顶后的堆序重整过程中。删除堆顶后把新的堆顶放置在满足堆序的正确的位置上。分两种情况:①若是大顶堆:哪个数值大哪个上去(去父节点)②若是小顶堆:哪个数值小哪个上去。


举例:

下列代码的功能是从一个大顶堆H的某个指定位置p开始执行下滤。

/*大顶堆的下滤:(左右孩子结点)谁数值大谁上*/
void PercolateDown( int p, PriorityQueue H )
{
   int  child;
   ElementType  Tmp = H->Elements[p];
   for ( ; p * 2 <= H->Size; p = child ) {
      child = p * 2;
      /*在同一个父节点上,有左右孩子,如果2*p不是最后的结点,意味着存在右孩子。
        若左孩子小于右孩子,右孩子上去,即child++ 。第一个if是左右孩子的比较*/
      if ( child!=H->Size && H->Elements[child] < H->Elements[child+1] )
         child++;
      /*第二个if是左右孩子较大的那一个跟Tmp比较,谁大谁就在上面*/
      if ( H->Elements[child] > Tmp )
         H->Elements[p]=H->Elements[child];
      else  break;
   }
   H->Elements[p] = Tmp; 
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值