有人可以向我解释在递归遍历中递归是如何工作的。这里是我的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); }
会得到executed.There递归调用将inOrder(4);
自4的左点为null,则visit(4)
是执行打印数值4的行。
但是之后又是如何打印的。虽然最初当方法被t.inOrder(t.root);
调用时,局部变量p被分配了值为5的BinaryNode,现在p是4。然后在打印出4之后,可以执行的下一行是
if(p.right!=null){ inOrder(p.right); }
但是因为现在p.right在BinaryNode中引用了元素4的权利,而4的权利是null,所以这也不会被执行。
那么如何保持递归?
它如何打印5和其余节点?
这是很难不图纸解释...也许找到一个在线视频。 ..但让我试试。我认为你的问题是你将节点与价值混淆在一起;序(根)是不太一样的序(5)...根是具有5也左右 – okaram
至于它是如何实现的,通常有一个堆栈中的节点;当你调用一个函数时,参数会被推入栈中,也是返回的地方;当返回时,结果被放入堆栈,调用者的地址被取出,然后我们返回到那个地方。 – okaram
@okaram:我明白inOrder(root)是一个BinaryNode作为参数。我写在order(5)中,以便我可以很容易地解释它 –