我想弄清楚爲什麼控制檯輸出卡在葉無限循環時,我用代替如果在下面的代碼。預先遍歷二叉樹。如果vs而
void preOrder(Node root) {
Node n = root;
while(n != null) {
visit(n);
preOrder(n.left);
preOrder(n.right);
}
}
當預購遞歸函數被調用的葉子,葉子沒有左child.Shouldn't執行停在那裏。
我想弄清楚爲什麼控制檯輸出卡在葉無限循環時,我用代替如果在下面的代碼。預先遍歷二叉樹。如果vs而
void preOrder(Node root) {
Node n = root;
while(n != null) {
visit(n);
preOrder(n.left);
preOrder(n.right);
}
}
當預購遞歸函數被調用的葉子,葉子沒有左child.Shouldn't執行停在那裏。
問題是,當有while(n != null)
時,你永遠不會將n
重新分配給可能不是null
的東西,從而導致無限循環。
的if
語句是你所需要的,因爲你已經有遞歸調用,這將遍歷樹,直到葉子中發現:
Node n = root;
if (n != null) {
visit(n);
preOrder(n.left);
preOrder(n.right);
}
while(n != null)
將始終爲真或從不爲真,因爲循環的主體不會更改n
的值。因此,循環將永遠不會執行或是無限的。
由於您使用的是遞歸,所以不需要循環。
void preOrder(Node root) {
Node n = root;
if (n != null) {
visit(n);
preOrder(n.left);
preOrder(n.right);
}
}
當預購遞歸函數被調用的葉子,葉子沒有左child.Shouldn't執行停在那裏
嗯,preOrder(n.left)
執行將終止(因爲n.left
爲空),但之後它將返回到先前的preOrder
呼叫,並呼叫preOrder(n.right)
,如果該呼叫終止,則它將被卡在無限while循環中。