实现使用:2011年10月28日数据结构实验室练习要做的:实现一个二叉搜索树
问题:K[]方法preOrder(), inOrder()和postOrder()返回
问题细节:BST必须只有它的根作为参数。上述方法已在我们教授给出的界面中描述如下:
/**
* Returns an array of keys filled according
* to the pre-order traversing in a BST.
*/
public K[] preOrder();
public K[] order();
public K[] postOrder();
我可以用下面的代码实例化这个泛型数组:
public K[] preOrder() {
if (root == null) { return null; }
ArrayList<K> list = new ArrayList<K>();
preOrderRecursive(root,list);
K[] toReturn = (K[]) Array.newInstance(this.getRoot().getKey().getClass(), list.size());
for (int i = 0; i < list.size(); i++) {
toReturn[i] = list.get(i);
}
return toReturn;
}
但是,当我使用我们教授提供的测试类测试该方法时,我得到了一个nullPointerException,我认为它指的是BST的根,已经实例化一次,但在测试中的某个点已被删除,当它再次调用该方法时,该方法返回null,而不是测试预期的空数组:
(...)
tree1 = new BSTImpl<Integer, Integer>();
for (int i = 0; i < SIZE; i++) {
tree1.insert(i, i);
}
tree1.remove(1);
tree1.remove(2);
tree1.remove(3);
tree1.remove(4);
assertArrayEquals(new Integer[]{},tree1.preOrder());
(...)
知道我不能改变返回类型和方法的参数,我能做些什么来避免这个异常?我能以某种方式得到组件类型,并使用它来实例化空数组(我怎么做到这一点?)?
问题是:您真的需要返回Integer数组吗?-我不这么认为。
我假设assertArrayEquals()
不检查数组的组件类型,而只是比较包含的值。
对于您所展示的代码,我想说由于类型擦除,其他任何操作都是不可能的。
试着返回Object[]
或任何超类型
return new Object[0];
和
return list.toArray();
(需要未检查强制转换,但这应该是可以的)
编辑:点击<K extends Comparable>
?
在这种情况下使用:
return new Comparable[0];
和
return (Comparable[])list.toArray(new Comparable[]);