递归检查数组是否表示堆

时间:2012-12-13 04:16:42

标签: java arrays recursion heap

我们如何检查数组是否递归表示堆数据结构? 假设它是一个整数数组,我正在检查最大堆。 以下是我提出的建议,但我不知道这是否正确。

public static boolean isHeap(int[] arr) {
      if (arr = null)
           return false;
      return isHeapTree(arr, 0);
}

private static boolean isHeapTree(int[] arr, int i) {
           if (i = arr.length - 1)
               return true;
           // check if a parent's value is larger or equal to both of
           // its left child and right child
           else if (arr[i] >= arr[2i + 1] && arr[i] >= arr[2i + 2])
               return (isHeapTree(arr, 2i + 1) && isHeapTree(arr, 2i + 2));
           else
               return false;
}

is it possible a binary heap could be incomplete? say:
         100
        /   \
       50   20
      /  \    \
     30  40   26

2 个答案:

答案 0 :(得分:2)

一些意见:

  • 你绝对不需要while循环 - 你总是在第一次迭代后返回

  • 2i + 1在java中不起作用,您需要使用2*i + 1

  • arr[2*i + 1]arr[2*i + 1]可能会抛出ArrayIndexOutOfBoundsException,因此您需要手动执行范围检查,或将其包装在try.. catch块中

答案 1 :(得分:1)

通常,当堆存储在数组中时,它始终打包在左侧。换句话说,当堆具有n个元素时,索引范围[0, n-1]中数组中的所有元素都包含元素。每个插入都首先将元素放在索引size()处,然后跳转直到它小于其父元素。

所以你采取的方法可以成功。

另请注意,在您的代码中,您可以通过对警卫进行一些小改动来处理越界:

public static boolean isHeap(int[] arr, int size) {
  return (null == arr) ? false : isHeapTree(arr, size, 0);
}

private static boolean isHeapTree(int[] arr, int size, int i) {
  assert i >= 0;
  assert size <= arr.length;
  if (i >= size) return true;
  ...