You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅使用堆操作查找最小堆中的最小叶子节点?

嘿,这个问题挺有意思的!要仅用堆操作找出最小堆里的最小叶子节点,我们可以结合最小堆的结构特性和标准堆操作来实现,具体步骤如下:

核心思路

先回忆下最小堆的关键结构特点:在最常用的数组实现的最小堆中(0-based索引),所有非叶子节点的索引范围是从0到floor(n/2)-1(n是堆的总元素数),而叶子节点则从floor(n/2)开始一直到最后一个元素。基于这个特性,我们可以通过移除所有非叶子节点,剩下的叶子节点组成的堆的堆顶就是我们要找的最小值。

具体步骤

  • 复制原堆:先创建原堆的一个副本,避免修改原始数据(你可以通过逐个将原堆元素插入新堆的方式完成复制,这属于标准堆操作)。
  • 移除所有非叶子节点:非叶子节点的数量正好是floor(n/2)个,所以我们对副本堆执行floor(n/2)次extract-min操作——每次操作会提取当前堆的最小值(堆顶),然后堆会自动重新调整结构维持最小堆性质。
  • 获取结果:当完成所有非叶子节点的提取后,副本堆里剩下的全是原堆的叶子节点,此时副本堆的堆顶元素就是所有叶子节点中的最小值。

举个实际例子

假设我们有一个最小堆,数组形式为[1, 2, 3, 4, 5, 6](总元素数n=6):

  • 非叶子节点数量是6//2=3,对应元素1、2、3。
  • 执行3次extract-min:
    1. 第一次提取1,堆调整为[2, 4, 3, 5, 6]
    2. 第二次提取2,堆调整为[3, 4, 6, 5]
    3. 第三次提取3,堆调整为[4, 5, 6]
  • 此时堆顶的4就是原堆叶子节点(4、5、6)中的最小值。

额外注意点

  • 如果堆只有1个元素(n=1),那这个元素既是根也是叶子,直接返回它就行。
  • 全程只用到了最小堆的标准操作:insert(用于复制堆)、extract-min(移除非叶子节点)、peek(查看堆顶结果),完全符合“仅借助堆操作”的要求。

内容的提问来源于stack exchange,提问作者Monica Charles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:20:50