2017-02-16 1 views
1

私は、以下のコードでifの代わりに使用しているときに、コンソールの出力がリーフの無限ループに詰まっているのを理解しようとしています。予約限定のための再帰関数は、リーフで呼ばれプレオーダーバイナリーツリーのトラバーサル。もしも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)の場合、nullではない可能性のあるものにnを再割り当てすることはないため、無限ループになります。

すでに葉が発見されるまで、ツリーアップを横断する再帰呼び出し、持っているので、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); 
    } 
} 

、葉には、左はまあ、preOrder(n.left)の実行が(終了する実行が

停止child.Shouldn'tていませんn.leftがヌルなので)、それまでのpreOrderコールに戻り、preOrder(n.right)にコールし、そのコールが終了すると、無限ループ中でスタックされます。

関連する問題