【问题标题】:Recursively check if an array represents a heap递归检查数组是否代表堆
【发布时间】:2012-11-30 22:19:23
【问题描述】:

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

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

【问题讨论】:

  • 你真的需要递归吗>
  • 似乎是对的..你觉得有什么问题?
  • 如果2i + 1 大于arr.length 会怎样 isHeapTree(arr, 2i + 1) 返回...
  • is it possible a binary heap could be incomplete? 不是这种方式,不。

标签: java arrays recursion heap


【解决方案1】:

一些cmets:

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

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

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

【讨论】:

  • 感谢您的帮助丹尼斯。我正在考虑使用它检查数组索引,这可能是错误的方法。
【解决方案2】:

通常,当堆存储在数组中时,它总是被压缩到左边。也就是说,当堆中有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;
  ...

【讨论】:

  • 感谢 Dilum 的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-03-26
  • 2021-04-15
  • 1970-01-01
  • 2019-01-06
  • 2021-11-19
  • 2014-06-21
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多