使用我自己的树

时间:2016-05-09 08:00:40

标签: java recursion

我有两段代码,在我看来做同样的事情,但它没有。 我正在尝试为自定义集树创建一个迭代器。这是代码。

public LinkedList<AnyType> traverse (TheNode<AnyType> node,LinkedList<AnyType> theList){ 
    if (node.left != null)
        return traverse (node.left,theList);        
    theList.push(node.element);
    if (node.right != null)
        return traverse (node.right,theList);       

    return theList;

}

public void traverseNrTwo (TheNode<AnyType> node){ 
    if (node.left != null){
        traverseNrTwo (node.left);
    }
    list.push(node.element);
    if (node.right != null){
        traverseNrTwo (node.right);
    }
}

traverse只会通过树的左侧并将其添加到列表中,但traveseNrTwo会遍历整个树。所以,我的问题是,他们为什么要做两件不同的事情?

1 个答案:

答案 0 :(得分:4)

您不应该返回递归调用的结果,因为它会导致递归访问树的左侧。

public LinkedList<AnyType> traverse (TheNode<AnyType> node,LinkedList<AnyType> theList){ 
    if (node.left != null)
        traverse (node.left,theList); // if you return traverse(node.left,theList) here,
                                      // you end the recursion without adding the current
                                      // node and visiting the right sub-tree 
    theList.push(node.element);
    if (node.right != null)
        traverse (node.right,theList);       

    return theList;   
}

另请注意,由于您将LinkedList<AnyType>作为参数传递给您的方法(即您没有在方法中创建新的LinkedList实例),因此您不必返回它。您只需将返回类型更改为void