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

时间:2011-10-30 20:33:42

标签: java generics data-structures binary-search-tree

实施用途: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());

    (...)

知道我无法更改返回类型和方法的参数,我该怎么做才能避免此异常?我可以以某种方式获取组件类型并使用它来实例化空数组(我是怎么做到的?)?

我们也欢迎任何改进我的代码的提示。

1 个答案:

答案 0 :(得分:0)

问题是:你真的需要返回 Integer 数组吗? - 我不这么认为。

我认为assertArrayEquals() 检查数组的组件类型,而只是比较包含的值。

根据您展示的代码,我会说由于类型擦除而无法实现其他任何目的。

因此,尝试在您的案例中返回Object[]或任何超类型:

return new Object[0];

return list.toArray();

(需要未经检查的强制转换,但应该是o.k。)

编辑:

好的,<K extends Comparable>? 在这种情况下使用:

return new Comparable[0];

return (Comparable[])list.toArray(new Comparable[]);