让我们说我想检查堆中的索引是否有子节点。这个堆实现是Java中的数组形式。
在我的boolean hasChild
函数中,我考虑使用if(index < currentSize/2)
进行检查,其中currentSize是用于实现堆的数组的大小。
这是否适用于根位于索引0或1的情况?我觉得很难想象它。如果是前者,我该如何实施后者?反之亦然。
如果有任何不清楚的地方,我们会编辑帖子。
(抱歉,我需要2k代表接受编辑)
答案 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的定义。但是如果要构建最大堆,则您的公式基本上看起来是正确的。