堆代码行说明

时间:2018-05-23 15:27:52

标签: c data-structures heap

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>

你能给我一个更具体的解释吗?

2 个答案:

答案 0 :(得分:2)

在大小为n的基于零的数组托管堆中,n > 0保持为true,给定任何父节点索引ii位于[0,n-1] 1}},其中n是堆的节点数,可以在以下位置找到相应的子节点:

2 * i + 1
2 * (i + 1)

在这种情况下,上述每一项同样都在[0,n-1]

鉴于此,可以通过获取堆大小,减去一个占用的值来确定第一个节点,它真正没有可能的子节点(因此是堆中该点的叶子节点)从零开始的索引模型,然后整数除以2。

给定一个大小为7的堆,该等式产生3.这是有道理的,因为给定索引

0 1 2 3 4 5 6

我们知道

  • 0是1,2
  • 的父母
  • 1是3,4
  • 的父母
  • 2是5,6
  • 的父母

因此,树中没有子项的第一个节点是3.您正在质疑的条件只是确定节点是否小于该位置,如果是,则进一步采取行动;否则停止。

答案 1 :(得分:0)

条件标志似乎正在测试indexMaxim是否对应于堆的内部节点,而不是叶节点。如果它是一个内部节点,那么该值可能需要向下过滤,因此(递归?)调用filtrareHeap(),但如果它是一个叶子节点,那么该值不能比这更远节点