2017-02-16 181 views
1

我想弄清楚爲什麼控制檯輸出卡在葉無限循環時,我用代替如果在下面的代碼。預先遍歷二叉樹。如果vs而

void preOrder(Node root) { 
    Node n = root; 
    while(n != null) { 
     visit(n); 
     preOrder(n.left); 
     preOrder(n.right); 
     } 
    } 

當預購遞歸函數被調用的葉子,葉子沒有左child.Shouldn't執行停在那裏。

回答

2

問題是,當有while(n != null)時,你永遠不會將n重新分配給可能不是null的東西,從而導致無限循環。

if語句是你所需要的,因爲你已經有遞歸調用,這將遍歷樹,直到葉子中發現:

Node n = root; 
if (n != null) { 
    visit(n); 
    preOrder(n.left); 
    preOrder(n.right); 
} 
3

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循環中。