【发布时间】:2011-10-30 20:33:42
【问题描述】:
实施使用: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());
(...)
知道我不能改变返回类型和方法的参数,我能做些什么来避免这个异常?我可以以某种方式获取组件类型并使用它来实例化空数组(我是怎么做到的?)?
也欢迎任何改进我的代码的提示。
【问题讨论】:
-
您在创建数组时在
newInstance表达式中使用了array.size,但不确定array指的是什么。然后继续使用 list.size() 填充K[]。你确定array.size实际上有非零长度吗? -
这是一个简单的错误:我使用变量名称“array”来命名列表,当我在这里发布时,我将所有变量重命名为一个不言自明的名称,但忘记在那里重命名.表达式“array.size()”指的是列表,而不是数组。
标签: java generics data-structures binary-search-tree