【发布时间】:2016-07-21 14:53:41
【问题描述】:
我一定错过了一些非常简单的东西,因为这让我大吃一惊!
我正在尝试使用 CompleteBinaryTree(使用数组实现)来实现堆。这个 CompleteBinaryTree 是一个 Position<T> 数组,其中每个 Position 包含一个元素。我正在为Heap编写add(T t)方法,其中t被插入到CompleteBinaryTree的下一个空闲位置,然后执行一个upheap过程,直到CompleteBinaryTree被排序。方法如下:
private CompleteBinaryTree<T> tree = new CompleteBinaryTree<T>();
private Position<T> entry = null;
public void add(T t) {
entry = tree.add(t);
if (entry.equals(tree.root())) {
return;
}
//continue to swap inserted element with its parent
//while it is smaller than its parent
while (entry.element().compareTo(tree.parent(entry).element()) < 0) {
Position<T> parent = tree.parent(entry);
Position<T> temp = entry;
entry = parent;
parent = temp;
}
}
第一个元素被很好地添加到堆中,但是当我尝试添加第二个元素时,InvalidPositionException 被抛出while() 行。这是从 CompleteBinaryTree 类内部抛出异常的地方:
public Position<T> parent(Position<T> p) {
if (p == root()) throw new InvalidPositionException();
return array[((ArrayPosition) p).index/2];
}
下面是CompleteBinaryTree使用的另外两种方法:
public Position<T> root() {
if (isEmpty()) throw new InvalidPositionException();
return array[1];
}
public Position<T> add(T t) {
if (last == array.length) {
// extend array
ArrayPosition[] temp = (ArrayPosition[]) new Object[array.length*2];
for (int i=1; i < array.length; i++) {
temp[i] = array[i];
}
array = temp;
}
array[last] = new ArrayPosition(last, t);
return array[last++];
}
当我第一次检查 p 是否为根时,我如何因为p == root() 而引发异常?
编辑
这里是 CompleteBinaryTree toString(),它是由 Heap 返回的 toString():
public String toString() {
StringBuffer buf = new StringBuffer();
for (int i = 1; i < last; i++) {
buf.append(" ").append(array[i]);
}
return buf.toString();
}
【问题讨论】:
-
root()可能是在扔。 -
但是在抛出异常之前,如果
entry是根,则方法返回,但是由于entry是根,所以抛出异常? -
你调试了吗?
if (p == root())或if (isEmpty())是否引发异常,最好将throw new InvalidPositionException();移动到新行
标签: java arrays exception heap binary-tree