对于一个项目,我是否正在处理堆。在这个项目中,我必须“调查”数组是否是最大堆。
这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;
}
}
答案 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。
否则,进行正常循环。