二叉搜索树的 K[] preOrder() 方法:关于泛型返回



实现使用: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[]);

最新更新