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

参考链接:https://blog.csdn.net/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; 
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值