检查具有n元素的数组是否为最小堆的算法

时间:2010-11-11 17:17:05

标签: arrays tree heap minimum

我正在尝试概述一种算法,以确定我的数组是否是最小堆。那里有什么文件可以帮我解决这个问题吗?我在Apache的网站上找到了一个函数,但它没有准确显示该函数的工作原理;只是存在一个函数(BinaryHeap(boolean isMinHeap))。

3 个答案:

答案 0 :(得分:1)

The Wikipedia article可以帮到你。

以下是一些让您考虑解决方案的问题:

  1. 假设堆是最小堆,那么堆的根必须是什么呢?
  2. 如果堆的根满足min heap属性,那么如何确保root的子树也包含属性?
  3. 如果树的根没有孩子怎么办?它是最小堆吗?

答案 1 :(得分:1)

我认为这会奏效!

bool checkminheap(int arr[],root)
{
     if(root>=sizeof(arr)/sizeof(arr[0])-1)
         return 1;
     if(arr[root]>arr[2*root] || arr[root]>arr[2*root+1])  //check root is the smallest element
      return 0; 
    if(!checkminheap(arr,2*root))//check leftsubtree
      return 0;
    if(!checkminheap(arr,2*root+1))//check rightsubtree
      return 0;

     return 1;
}  

答案 2 :(得分:1)

使用java泛型支持添加详细解决方案,相对容易理解。

public static <T extends Comparable<T>> boolean isMinHeap(T arr[], int rootIndex) {
  boolean isMaxH = true;
  int lChild = 2 * rootIndex + 1;
  int rChild = 2 * rootIndex + 2;

  // Nothing to compare here, as lChild itself is larger then arr length.
  if (lChild >= arr.length) {
    return true;
  }

  if (arr[rootIndex].compareTo(arr[lChild]) > 0) {
    return false;
  } else {
    isMaxH = isMaxH && isMinHeap(arr, lChild);
  }

  // rChild comparison not needed, return the current state of this root.
  if (rChild >= arr.length) {
    return isMaxH;
  }

  if (arr[rootIndex].compareTo(arr[rChild]) > 0) {
    return false;
  } else {
    isMaxH = isMaxH && isMinHeap(arr, rChild);
  }

  return isMaxH;
}