假设所有元素都是不同的,那么最小的元素可能位于 max-heap 中的什么位置?

Where in a max-heap might the smallest element reside, assuming that all elements are distinct?

问题:假设所有元素都不同,max-heap 中最小的元素可能位于何处?

我了解到在max-heap中,最大的节点是根节点,最小的节点是叶子节点之一。我发现答案说它在任何叶子中,即索引为 ⌊n/2⌋+k 的元素,其中 k>=1 ,即在堆数组的后半部分。

问题: 你能解释一下为什么我找到的答案不只是说它是叶子之一吗?你能解释一下为什么要通过 ⌊n/2⌋+k 回答吗?第二,为什么在后半部分,当它在树的最后一层时,所有 parent 都大于它们的 children,所以高度 1 的 child 小于parent 但大于其 child 等等。

已编辑:你能解释一下为什么叶子的索引是⌊n/2⌋+1, ⌊n/2⌋+2, ..., ⌊n/2⌋+n吗?或者为什么最后一个 non-leaf 节点的索引在 array-based 堆的 ⌊n/2⌋ 处?我们知道堆的总顶点数由 Ceil(n/2^(h+1)) 给出。叶子数是Ceil(n/2),所以希望额外的细节能帮助解决这个问题。

在一个zero-based索引数组中,根在索引0。根的children在索引1和2。一般来说索引的children位于索引 2+1 和 2+2。

所以一个节点要有children,我们必须让2+1(即左边的child)还在数组的范围内,即2+1 < ,数组的大小在哪里(即最后一个索引为 -1)。

第一个叶子的索引是什么?那将是 2+1 < 不成立的最小值,即当 2+1 ≥ 时。从中我们可以得出:

  • 表示叶子的所有索引都组合在一起。他们都在 ,为此 2+1 ≥

  • 叶子的最小索引在index = /2.

如果您正在使用 one-based 索引数组(这在伪代码中很常见),那么您可以调整上述推理来得出第一个叶子位于索引 = /2+1.

所以你引用的答案是假设一个从 1 开始的索引数组,然后说第一个叶子位于 /2[=28= 是正确的]⌋+1,并且任何叶子在/2⌋[=37=的位置]+,其中 ≥1.