我有两段代码,在我看来做同样的事情,但它没有。 我正在尝试为自定义集树创建一个迭代器。这是代码。
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
会遍历整个树。所以,我的问题是,他们为什么要做两件不同的事情?
答案 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
。