BinarySearchTree中的遍历PreOrder(Java)

时间:2014-06-07 14:23:12

标签: java tree binary-search-tree

我需要一些帮助。我已经通过JUnit运行了我的完整代码,但我仍然遇到错误。我认为这是因为我的遍历代码。

遍历代码的目的是在PreOrder中创建一个LinkedList。

例如:JUnit总是说那样的东西是错的

assertArrayEquals( new Integer[]{2, 14, 26, 86, 122, 134, 182},
    Arrays.copyOf(tree.traversePreOrder(), tree.getSize(), Integer[].class));

@Override
public Object[] traversePreOrder() {
    BinaryTreeNode<T> x = root;
    LinkedList<Object> y = new LinkedList<Object>();

    if (x == null) {
        return null;
    } else {
        y.add(x.value);
        y.add(travPreOrd(x.getLeft()));
        y.add(travPreOrd(x.getRight()));
    }
    return y.toArray();
}

public LinkedList<Object> travPreOrd(BinaryTreeNode<T> x) {
    BinaryTreeNode<T> tmp = x;
    LinkedList<Object> space = new LinkedList<Object>();

    if (x == null) {
        return null;
    } else {
        space.add(tmp.getValue());
        space.add(travPreOrd(x.getLeft()));
        space.add(travPreOrd(x.getRight()));
    }
    return space;
}

2 个答案:

答案 0 :(得分:0)

您遇到了一个大问题,因为如果节点不存在,您总是会添加travPreOrd的结果,这是另一个List<Object>null

这些情况的最佳解决方案是将重写的方法保持为非递归方法并重载此方法,该方法使用递归并且具有一个参数,用于接收必须添加数据的容器:

public List<Object> travPreOrd(BinaryTreeNode<T> x) {
    BinaryTreeNode<T> tmp = x;
    List<T> space = new LinkedList<T>();
    travPreOrd(x, space);
    return space;
}

private void travPreOrd(BinaryTreeNode<T> x, List<T> space) {
    if (x == null) {
        return;
    }
    space.add(tmp.getValue());
    travPreOrd(x.getLeft(), space);
    travPreOrd(x.getRight(), space);
}

答案 1 :(得分:0)

要将一个列表的内容添加到另一个列表,请使用addAll

所以而不是:

    y.add(x.value);
    y.add(travPreOrd(x.getLeft()));
    y.add(travPreOrd(x.getRight()));

你想要

    y.add(x.value);
    y.addAll(travPreOrd(x.getLeft()));
    y.addAll(travPreOrd(x.getRight()));

然后你从travPreOrd返回null,这只会让你的生活更加艰难 - 然后你必须检查它并特别处理它。相反,你可以只返回一个空列表。

所以而不是

if (x == null) {
    return null;
}

你可以做到

if (x == null) {
    return Collections.emptyList();
}

编辑:您的部分问题是您使用的是List<Object> - 它允许您向其中添加任何内容,包括其他列表。如果你改为使用List<Integer>,或者你使用了泛型并且有一个List<T>,那么编译器就能告诉你你做错了什么。