3

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

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
4

2 回答 2

2

一些评论:

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

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

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

于 2012-12-13T04:29:23.040 回答
1

通常,当堆存储在数组中时,它总是被压缩到左边。换句话说,当堆有n元素时,索引范围内的数组中的所有元素都[0, n-1]包含元素。每次插入都首先将元素放置在 index 处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;
  ...
于 2012-12-13T05:10:23.920 回答