有人可以向我解釋在遞歸遍歷中遞歸是如何工作的。這裏是我的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)中,以便我可以很容易地解釋它 –