Java:检查数组是否为堆

Java:检查数组是否为堆,java,algorithm,heap,Java,Algorithm,Heap,我试图实现一个检查给定数组是否是堆的方法 public static boolean Heap(int[] A) { for (int i = 1; i <= (A.length - 2) / 2; i++) { if (A[i] < A[2 * i] || A[i] < A[2 * i + 1]) { return false; } } return true; } 当我为上面的数组调用函数时,

我试图实现一个检查给定数组是否是堆的方法

public static boolean Heap(int[] A)
{
    for (int i = 1; i <= (A.length - 2) / 2; i++) {
        if (A[i] < A[2 * i] || A[i] < A[2 * i + 1]) {
            return false;
        }
    }
    return true;
}
当我为上面的数组调用函数时,它们都返回true,而如果A[I]
我做错了什么?

也许这就是你想要的:

public static void main(String... args) {
    int[] A = {50, 45, 40, 35, 20, 25, 20};
    int[] B = {45, 50, 40, 35, 20, 25, 20};
    System.out.println(isMaxHeap(A));
    System.out.println(isMaxHeap(B));
}

private static boolean isMaxHeap(int[] arr) {
    int N = arr.length;
    for (int i = (N - 2) / 2; i > -1; --i) { // start from the first internal node who has children;
        int j = 2 * i + 1; // the left child;
        if (j < N - 1 && arr[i] < arr[j+1]) j++; // select the bigger child;
        if (arr[i] < arr[j]) return false; // if parent is smaller than the child;
    }
    return true;
}

但请在下一次提问之前表现出一些努力

自下而上的解决方案很简单:检查每个节点,看它是否大于其父节点。对于最小堆,将>更改为忽略第一个值的任何原因,即a[0]?谢谢@Andreas。实际上我不知道为什么我从[1]开始。从[1]开始是找到2*I和2*I+1的孩子所必需的。您的堆只需要在索引0处包含null。我投票将此问题作为非主题来结束,因为它不是建设性的。
public static void main(String... args) {
    int[] A = {50, 45, 40, 35, 20, 25, 20};
    int[] B = {45, 50, 40, 35, 20, 25, 20};
    System.out.println(isMaxHeap(A));
    System.out.println(isMaxHeap(B));
}

private static boolean isMaxHeap(int[] arr) {
    int N = arr.length;
    for (int i = (N - 2) / 2; i > -1; --i) { // start from the first internal node who has children;
        int j = 2 * i + 1; // the left child;
        if (j < N - 1 && arr[i] < arr[j+1]) j++; // select the bigger child;
        if (arr[i] < arr[j]) return false; // if parent is smaller than the child;
    }
    return true;
}
for (int i = a.length-1; i > 0; --i)
{
    int parent = (i-1)/2;
    if (a[i] > a[parent]) return false;
}
return true;
bool isMaxHeap(int[] a)
{
    return isMaxHeap(a, 0);
}

bool isMaxHeap(int[] a, int ix)
{
    int leftChild = (ix*2)+1;
    if (leftChild < a.length)
    {
        if (a[leftChild] > a[ix]) return false;
        if (!isMaxHeap(a, leftChild) return false;
    }

    int rightChild = leftChild+1;
    if (rightChild < a.length)
    {
        if (a[rightChild] > a[ix]) return false;
        if (!isMaxHeap(a, rightChild) return false;
    }
    return true;
}