从递归方法返回时需要帮助
我正在尝试跟踪二叉树(不是二叉搜索树)中节点的路径。给定一个节点,我试图从根打印路径的值。
我有编写了以下程序。
package dsa.tree;
import java.util.Stack;
public class TracePath {
private Node n1;
public static void main(String args[]){
TracePath nodeFinder = new TracePath();
nodeFinder.find();
}
public void find(){
Tree t = getSampleTree();
tracePath(t,n1);
}
private Tree getSampleTree() {
Tree bsTree = new BinarySearchTree();
int randomData[] = {43,887,11,3,8,33,6,0,46,32,78,76,334,45};
for(int i=0;i<randomData.length;i++){
bsTree.add(randomData[i]);
}
n1 = bsTree.search(76);
return bsTree;
}
public void tracePath(Tree t, Node node){
trace(t,node);
}
Stack<Node> mainStack = new Stack<Node>();
public void trace(Tree t, Node node){
trace(t.getRoot(),node);
}
private void trace(Node parent, Node node){
mainStack.push(parent);
if(node.data == parent.data){
for(Node iNode:mainStack){
System.out.println(iNode.data);
}
return;
}
if(parent.left != null){
trace(parent.left, node);
}
if(parent.right!=null){
trace(parent.right, node);
}
mainStack.pop();
}
}
我得到了正确的输出。但它有点混乱。如果您看到方法trace(Node, Node),则我正在打印我不应该执行的值。我希望跟踪方法能够正确完成。至少,我应该在遇到 if 条件的阶段终止递归结构。
请指教。
I am trying to trace the path of a node in a binary tree (not a binary search tree). Given a node, I am trying to print the values of the path from the root.
I have written the following program.
package dsa.tree;
import java.util.Stack;
public class TracePath {
private Node n1;
public static void main(String args[]){
TracePath nodeFinder = new TracePath();
nodeFinder.find();
}
public void find(){
Tree t = getSampleTree();
tracePath(t,n1);
}
private Tree getSampleTree() {
Tree bsTree = new BinarySearchTree();
int randomData[] = {43,887,11,3,8,33,6,0,46,32,78,76,334,45};
for(int i=0;i<randomData.length;i++){
bsTree.add(randomData[i]);
}
n1 = bsTree.search(76);
return bsTree;
}
public void tracePath(Tree t, Node node){
trace(t,node);
}
Stack<Node> mainStack = new Stack<Node>();
public void trace(Tree t, Node node){
trace(t.getRoot(),node);
}
private void trace(Node parent, Node node){
mainStack.push(parent);
if(node.data == parent.data){
for(Node iNode:mainStack){
System.out.println(iNode.data);
}
return;
}
if(parent.left != null){
trace(parent.left, node);
}
if(parent.right!=null){
trace(parent.right, node);
}
mainStack.pop();
}
}
I am getting the output properly. But its kind of messy. If you see the method trace(Node, Node), I am printing the values which I should not do. I want the trace method to properly complete. At least, I should kill the recursive structure at the stage i encounter the if condition.
Please advise.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
好的,一旦找到节点,您就需要终止递归。够简单的。更改您的跟踪方法以返回一个布尔值,告诉我们是否找到该节点。这样,我们在找到节点后立即返回树。
Okay, you need to kill the recursion once you find your node. Simple enough. Change your trace method to return a boolean telling us if the node was found. That way, we go right back up the tree immediately after finding the node.
我认为这是家庭作业,所以我将给出一些指示而不是一些代码。
编辑后要打印的节点列表:
如果需要到根的路径节点,一个简单的布尔返回就足够了:
如果您需要从根到节点的路径,您可以传递一个列表来按顺序接收节点:
或者您可以在返回时构建路径并返回为一个清单。
I assume this is homework, so I will give some pointers instead of some code.
Edit:
If the path node to root is wanted, a simple boolean return suffices:
If you need the path from root to node, you can pass a List to receive the nodes in order:
alternatively you can build the path on your way back and return as a list.
像这样的东西?
Something like this ?
这是一个不使用堆栈的递归函数。递归在技术上相当于堆栈,并且在进行递归时一定不需要堆栈。
PS:我正在写一个伪代码。自己重写以编译它:)
Here is a recursive function without any use of stack. A recursion is equivalent to stack techincally and you must not need stack when doing recusrion.
PS: I am writing a pseudo code. Rewrite it yourself to get it compiled :)
从跟踪返回一个布尔值,并根据递归调用返回的值决定是否继续搜索。
Return a boolean from trace and decide whether or not to continue searching based on the value being returned from the recursive call.