递归最小堆错误

Recursive min-heap error?

本文关键字:错误 递归      更新时间:2023-10-16

我编写了下面的代码来构造最小堆。这是一个递归调用。我不知道我在哪里出错了,因为输出不是minheap..有人可以帮助我这个:

 void MinHeap(int root, int bottom)
 {
 int parent;
 int temp;
 if(bottom > root)
 {
      parent = (bottom -1) / 2;
      if(HeapArray[parent] > HeapArray[bottom])
      {
           temp = HeapArray[parent];
           HeapArray[parent] = HeapArray[bottom];
           HeapArray[bottom] = temp;
           MinHeap(root, parent);
      }else if (HeapArray[parent] > HeapArray[bottom-1])
      {
           temp = HeapArray[parent];
           HeapArray[parent] = HeapArray[bottom-1];
           HeapArray[bottom-1] = temp;
           MinHeap(root, parent);              
      }
 } }
例如,我得到以下min_heap:

1935、1952、1940、1998、1962

这显然不是1952年和1998年的min_heap

代码看起来很好,您得到的是最小二进制堆数组压缩表示。

你可以这样解释你得到的数据:

1935, 1952, 1940,    1998,  1962
root--child1
    |    |---------- child1
    |    |------------------child2
    |-------child2
因为最小堆的规则是:
  • 该树为完全二叉树;也就是说,树的所有层次,除了最后一个(最深的)可能被完全填充,并且,如果树的最后一层不完整,该层的节点是从左至右填充

  • 根据比较谓词,所有节点要么[大于或等于]要么[小于或等于]它的每个子节点

(http://en.wikipedia.org/wiki/Binary_heap)

代码正确地计算了最小堆。在你的问题中没有太多的信息,但对于你刚刚发布的(和代码),看起来是正确的。