构建初始堆为何要从最后一个分支结点开始而非最后一个子节点

堆是一个特殊的树形结构,在这个结构里,(以大根堆为例)每一个父节点的值都比它的子节点的值大。

在构建初始堆时,从最后一个非叶子节点(分支节点)开始,而不是从最后一个子节点开始,是因为这样可以确保从该节点开始到所有叶子节点的子树都是堆有序的。

  1. 堆的性质:在最大堆中,父节点的值总是大于或等于其子节点的值。因此,当我们从下往上(即从叶子节点向根节点)构建堆时,我们需要确保每个父节点都满足这个性质。
  2. 叶子节点无需调整:叶子节点没有子节点,因此它们自然满足堆的性质(因为没有子节点可以违反这个性质)。
  3. 非叶子节点可能需要调整:对于非叶子节点(即分支节点),我们需要检查它们是否满足堆的性质。如果不满足(其自身比其某一个子节点小),我们需要通过交换节点值来修复它,并可能递归地检查其子树。
  4. 效率:从最后一个非叶子节点开始构建堆,我们可以确保从该节点到所有叶子节点的子树都是堆有序的。当我们向上移动到父节点时,我们只需要关注该节点及其子树,而无需考虑该节点以上的部分。这减少了不必要的比较和交换操作,从而提高了效率。

简单来说,从最后一个非叶子节点开始构建堆就像一个“从下往上”的修复过程,它确保了我们只关注那些可能不满足要求的节点,并修复它们,而不是浪费时间在已经满足要求的叶子节点上。

ps:R [1..n]最后一个非叶子结点为i=n/2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值