if (index != indexMaxim)
{
Rezervare aux = heap.vectorRezervari[index];
heap.vectorRezervari[index] = heap.vectorRezervari[indexMaxim];
heap.vectorRezervari[indexMaxim] = aux;
if (indexMaxim < (heap.nrElements - 1) / 2) // I REALLY DONT GET WHAT THAT MEAN...
filtrareHeap(heap, indexMaxim);
}
我正在处理堆结构,我认为这一行是将indexMaxim的值与Parent节点进行比较,因此如果值小于filtrareHeap()方法,则调用它来交换索引。 / p>
你能给我一个更具体的解释吗?
答案 0 :(得分:2)
在大小为n
的基于零的数组托管堆中,n > 0
保持为true,给定任何父节点索引i
,i
位于[0,n-1]
1}},其中n
是堆的节点数,可以在以下位置找到相应的子节点:
2 * i + 1
2 * (i + 1)
在这种情况下,上述每一项同样都在[0,n-1]
鉴于此,可以通过获取堆大小,减去一个占用的值来确定第一个节点,它真正没有可能的子节点(因此是堆中该点的叶子节点)从零开始的索引模型,然后整数除以2。
给定一个大小为7的堆,该等式产生3.这是有道理的,因为给定索引
0 1 2 3 4 5 6
我们知道
因此,树中没有子项的第一个节点是3.您正在质疑的条件只是确定节点是否小于该位置,如果是,则进一步采取行动;否则停止。
答案 1 :(得分:0)
条件标志似乎正在测试indexMaxim
是否对应于堆的内部节点,而不是叶节点。如果它是一个内部节点,那么该值可能需要向下过滤,因此(递归?)调用filtrareHeap()
,但如果它是一个叶子节点,那么该值不能比这更远节点