是Heap Max吗?

时间:2018-07-31 19:31:48

标签: java heap max-heap

对于一个项目,我是否正在处理堆。在这个项目中,我必须“调查”数组是否是最大堆。

这2条规则适用于最大堆:

  1. 父项应大于或等于其子项。
  2. 堆中的每个节点应包含一个元素

因此,我创建了2个循环来检查这些规则是否适用。对我来说不幸的是,我的代码无法正常工作。

我有2个for循环:

 //Checks if there's a 0 value in the array. If so: Return false

    for (int i = 1; i <= A.length; i++) {
        System.out.println("A.length: " + A[i]);
        if (A[i] == 0) {
            System.out.println("weweh: "+ A[i]);
            return false;
        }

//Checks if either left or right child have a bigger value than itself

    for (int i = 1; i <= (A.length - 2) / 2; i++) {
        System.out.println("A: " + i);
        if (A[i] < A[2 * i] || A[i] < A[2 * i + 1]) {
            return false;
        }
    }


 //the array


 int A[] = {0, 40, 35, 30, 25, 15, 10, 5};

最后一个for循环有效,但是由于某种原因,我在第一个for循环中遇到了一个错误。循环可以找到一个数字。假设我选择了15个等于A [i]的值,那么它将起作用并返回false,但是当所选择的数字0不存在时,它将向我发送错误,并且在第二个循环中它不会继续进行。

 //Error:

 A.length: 40
A.length: 35
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
A.length: 30
A.length: 25
A.length: 15
A.length: 10
A.length: 5
    at ismaxheap.IsMaxHeap.MaxHeap(IsMaxHeap.java:24)
    at ismaxheap.IsMaxHeap.main(IsMaxHeap.java:15)
/Users/yusuf/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

全代码:

public class IsMaxHeap {

public static void main(String[] args) {
    MaxHeap();
    System.out.println("Max Heap:  " + MaxHeap());
}

public static boolean MaxHeap() {

    int A[] = {0, 40, 35, 30, 25, 15, 10, 5};

    for (int i = 1; i <= A.length; i++) {
        System.out.println("A.length: " + A[i]);
        if (A[i] == 0) {
            System.out.println("weweh: "+ A[i]);
            return false;
        }
    } 

    for (int i = 1; i <= (A.length - 2) / 2; i++) {
        System.out.println("A: " + i);
        if (A[i] < A[2 * i] || A[i] < A[2 * i + 1]) {
            return false;
        }
    }
    return true;
}

}

1 个答案:

答案 0 :(得分:0)

在您的第一个循环中,您使用<=

循环了更多
for (int i = 1; i <= A.length; i++) 

由于您尝试访问A[i],因此如果访问i == A.length,则超出范围。

应该是:

for (int i = 1; i < A.length; i++) 

现在,我不知道为什么从索引1开始,因为Java中的索引从0开始。

处理一个孩子的特殊情况

当数组长度为3时就是这种情况(因为零索引被忽略了)

您只需检查A[2] < A[1]是否为Max堆,否则立即返回false。

否则,进行正常循环。