在堆中检查hasChild

时间:2014-05-09 21:02:27

标签: java

让我们说我想检查堆中的索引是否有子节点。这个堆实现是Java中的数组形式。

在我的boolean hasChild函数中,我考虑使用if(index < currentSize/2)进行检查,其中currentSize是用于实现堆的数组的大小。

这是否适用于根位于索引0或1的情况?我觉得很难想象它。如果是前者,我该如何实施后者?反之亦然。

如果有任何不清楚的地方,我们会编辑帖子。

(抱歉,我需要2k代表接受编辑)

2 个答案:

答案 0 :(得分:0)

root根本不能为0。因为左子的索引是2n而右子是2n + 1,其中n是当前索引。并且0对于乘法是中性的。

如果使用数组实现堆...以下谓词就足够了:

(2 * idx&lt; = arr.size&amp;&amp; arr [2 * idx]!= null)&amp;&amp; (2 * idx + 1&lt; = arr.size&amp;&amp; arr [2 * idx + 1]!= null)

&#39;&LT; =&#39;因为你从1开始数而不是从0开始......

检查堆的这个参考: http://www.cs.bgu.ac.il/~ds132/wiki.files/ds132_ps9_updated.pdf

答案 1 :(得分:0)

假设最小堆。索引总是按惯例从1开始。这使得即使对于第一元素,位置公式也可以是一致的。使用这种约定,直接孩子总是2k和2k + 1。因此,对于不存在2k的孩子,必须> KMAX。

2k&gt; KMAX

k&gt; KMAX / 2

如果您使用的元素0为空的数组,则kmax实际上是数组大小 - 1.如果您使用的是具有索引偏移量的数组,那么它只是数组大小。因此,实现的实际公式取决于您对index和maxSize的定义。但是如果要构建最大堆,则您的公式基本上看起来是正确的。