首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历PreOrder in BinarySearchTree (Java)

遍历PreOrder in BinarySearchTree (Java)
EN

Stack Overflow用户
提问于 2014-06-07 14:23:11
回答 2查看 94关注 0票数 0

我需要些帮助。我已经通过JUnit运行了我的完整代码,但是仍然会出现错误。我想是因为我的代码。

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

例如: JUnit总是说这样的事情是不对的

代码语言:javascript
复制
assertArrayEquals( new Integer[]{2, 14, 26, 86, 122, 134, 182},
    Arrays.copyOf(tree.traversePreOrder(), tree.getSize(), Integer[].class));

代码语言:javascript
复制
@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;
}
EN

回答 2

Stack Overflow用户

发布于 2014-06-07 14:35:53

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

对于这些情况,最好的解决方案是将重写的方法保持为非递归和重载方法,该方法使用递归,并在接收容器时使用参数,在容器中必须添加数据:

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2014-06-07 14:36:23

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

因此,与其:

代码语言:javascript
复制
    y.add(x.value);
    y.add(travPreOrd(x.getLeft()));
    y.add(travPreOrd(x.getRight()));

你想要的

代码语言:javascript
复制
    y.add(x.value);
    y.addAll(travPreOrd(x.getLeft()));
    y.addAll(travPreOrd(x.getRight()));

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

所以而不是

代码语言:javascript
复制
if (x == null) {
    return null;
}

你可以

代码语言:javascript
复制
if (x == null) {
    return Collections.emptyList();
}

编辑:部分问题在于您使用的是一个List<Object>,它允许您添加任何内容,包括其他列表。如果您使用List<Integer>,或者使用泛型并具有List<T>,那么编译器将能够在您做错误的事情时告诉您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24098181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档