我试图将值插入最初为空的二进制堆。
这是相关代码:
public class minHeap
{
int[] array;
int n;
public void minHeap()
{
array = new int [16];
n = 0;
}
public void insert(int x) {
//if (n == array.length - 1)
//enlargeArray(array.length*2 + 1);
// Hole is generated at end of array
int hole = ++n;
System.out.println("H"+hole);
// Percolate up
for (array[0] = x; x < array[hole/2]; hole /= 2)
array[hole] = array[hole/2];
// Insert new element
array[hole] = x;
}
我从insert方法获取for循环中的NullPointerException
。这是我处理最初空阵列的方式吗?
这是初始化类:
public class BinaryHeap {
public static void main(String[] args)
{
int [] heapArray = {62, 75, 81, 71, 66, 69, 72, 73, 83, 82, 67, 72, 81, 73, 69, 90};
minHeap hp = new minHeap();
for(int i = 0; i < heapArray.length; i++)
{
hp.insert(heapArray[i]);
}
}
}
答案 0 :(得分:3)
array
未初始化,因为:
public void minHeap()
{
array = new int [16];
n = 0;
}
不是构造函数。构造函数没有返回类型,因此这只是一个常规方法,恰好与该类共享同名。
这意味着当您使用new minHeap()
时,您只需调用默认构造函数,该构造函数不会初始化任何字段,而array
的默认值为null
。
您要删除void
,如下所示:
public minHeap()
{
array = new int [16];
n = 0;
}
由于这是一个有效的构造函数,因此在创建实例时,array
将被正确初始化。
答案 1 :(得分:2)
您尚未定义构造函数。
你写了......
public void minHeap()
这是一种方法,因为它有一个&#34; void&#34;返回类型。
如果你放弃&#34; void&#34;它可能会有所帮助
答案 2 :(得分:0)
除了这里的其他答案(指出你想要的构造函数没有正确的签名),看起来你会遇到问题:
for (array[0] = x; x < array[hole/2]; hole /= 2)
在第一次插入时,hole = 0
但显然x等于array[hole/2]
,因为hole/2
的计算结果为0,所以此循环退出而不在n = 1上运行。
在第二次插入时,array[0] = x
会将先前传递中插入array[0]
的内容清除掉,并将其替换为新的x
。
我可以看到你正在尝试做什么,但它确实非常正确。