【发布时间】:2014-07-14 04:54:38
【问题描述】:
有人可以向我解释一下递归在顺序遍历中的工作原理吗?这是我的 inOrder() 方法。
public void inOrder(BinaryNode p){
if(p.left!=null){
inOrder(p.left);
}
visit(p);
if(p.right!=null){
inOrder(p.right);
}
}
public void visit(BinaryNode p){
System.out.println(p.element);
}
BinaryTree t=new BinaryTree();
t.insert(5);
t.insert(t.root,4);
t.insert(t.root,6);
t.insert(t.root,60);
t.insert(t.root,25);
t.insert(t.root,10);
t.inOrder(t.root);
inOrder() 方法可以正确打印元素,但我不明白它是如何工作的。
当我调用 t.inOrder(t.root); 时,因为 root 的值为 5,它类似于 inOrder(5);
并且有一个左节点,所以 if(p.left!=null){
inOrder(p.left);
}
将被执行。递归调用将是inOrder(4);
由于 4 的左侧指向 null,因此 visit(4) 是执行打印值 4 的行。
但是在那之后如何打印 5。虽然最初当 t.inOrder(t.root); 调用该方法时,局部变量 p 被分配了值为 5 的 BinaryNode,现在 p 为 4。然后在打印出 4 之后,下一行可以被执行是
if(p.right!=null){
inOrder(p.right);
}
但是由于 p.right 现在在 BinaryNode 中引用了元素 4 的 right 并且 4 的 right 为空,所以这也不会被执行。
那么递归是如何维护的呢?
它如何打印出 5 和其余的节点?
【问题讨论】:
-
没有图纸这很难解释......也许在网上找到一个视频......但让我试试。我认为您的问题是您将值与节点混淆了; inOrder(root) 与 inOrder(5) 不太一样……根是一个节点,它有 5,但也有左和右
-
至于如何实现,一般有栈;当你调用一个函数时,参数被推入堆栈,也是返回的地方;返回时,将结果入栈,取出调用者的地址,返回到那个地方。
-
@okaram:我知道 inOrder(root) 是一个 BinaryNode 作为参数。我写 inOrder(5) 只是为了方便解释
-
好的,那么让我来解释一下......当你调用一个函数(递归与否)时,编译器会生成代码来推送参数和当前地址;因此,当您调用 inOrder(root) 时,编译器会将 root 推入堆栈,然后是当前地址;当您进入函数内部时,您调用 inOrder(left),si 游览他的那个值,以及当前地址(现在在函数内部)......这一直持续到 left 为空。此时您返回到最后一个呼叫者,然后从那里继续。顺便说一句,您可能应该发送指针...
-
@okaram:所以当递归最终达到其基本情况时,所有中间递归调用都被评估了吗?我仍然没有正确理解这个概念
标签: java recursion data-structures binary-tree inorder