递归最小堆错误?

时间:2014-05-22 14:19:40

标签: c++ c data-structures

我编写了以下用于构建最小堆的代码..它是一个递归调用。我不知道我哪里出错了,因为输出不是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。

1 个答案:

答案 0 :(得分:1)

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

您可以按如下方式解释您获得的数据:

1935, 1952, 1940,    1998,  1962
root--child1
    |    |---------- child1
    |    |------------------child2
    |-------child2

并且由于最小堆的规则是:

  
      
  • 树是一个完整的二叉树;也就是说,树的所有级别,除了最后一个(最深)之外都是完全填充的,如果是   树的最后一级不完整,该级别的节点是   从左到右填充。

  •   
  • 根据比较谓词,所有节点都是[大于或等于]或[小于或等于]其子节点   为堆定义。

  •   

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

代码正确计算最小堆。您的问题中没有太多信息,但是您刚发布的内容(以及代码中的内容)看起来是正确的。