2016-04-29 12 views
0

ツリートラバーサルでの再帰実行の理解に問題があります。ここでツリートラバーサルでの再帰実行の理解

void travel (Node *tree) 
{ 
    if(tree!=NULL) 
    { 
     printf("%d ",tree->info); 
     travel(tree->left); 
     travel(tree->right); 
     } 
} 

あなたが説明することができ

 1 
    2  3 
4  5 6 

出力:4に到達した後に何が起こる1 2 3 4 5 6

いどのようにコンパイラに無視旅行(TREE->左)とどのように1に戻って3に達するのですか?

私の正確な質問はどのように関数呼び出し旅行(木 - >左)は無視されるのですか?

答えて

0

機能から復帰することがすべてです。

 void travel (Node *tree) 
{ 
    if(tree!=NULL) 
    { 
     printf("%d ",tree->info); 
     travel(tree->left); 
     travel(tree->right); 
     } 
} 


     1 
    2  3 
4  5 6 

上記の機能では、子どもがいるように左のパスをとります。左の子が見つからない場合は、右の子を試します。正しい子が見つからなければ、その関数を返します。ノード「4」に到達するまで、関数からの単一の戻り値はまだ処理されていません。私たちが4になると、左の子がもう残っていないことがわかります。したがって、私たちは正しい子を試してみるべきですが、正しい子もありません。だから私たちは私たちが呼び出された場所から関数を返します。それでは2になりました.2で残ったところから続けます.2では、travel(tree->left);命令を呼び出すことによって左の経路をとったので、今度はこの命令から戻り、次の命令であるtravel(tree->right);ああ、右の子がないので、私たちが始めた場所から関数を返します。ノード1の場合は、次の行のtravel(tree->right);になります。travel(tree->right);したがって、3に到着します。

+0

ご返信ありがとうございます。 ""私たちが4になると、それ以上左の子供が残っていることがわかります。したがって、私たちは正しい子供を試していますが、正しい子供もいません。 ""ここで、コンパイラは、左と右のノードが単なる関数パラメータではないので、子がそこにいるのを知ることはできますか?私は右か左の子供が欠席しているかどうかを確認するための条件を意味するので、どうなるのでしょうか? –

+0

こんにちは、このCコードで 'tree'は構造体へのポインタです(JSのコンストラクタ関数のように)。左右のプロパティも同様にポインタです。渡された引数が指すノードを処理するために、このポインタを 'travel(tree-> right)'のような 'travel'関数に渡すだけです。この場合、ノードの処理は、 'printf("%d "、tree-> info);'という命令を意味します。処理が終了したら、次のノードを引数として渡して、同じトラベル関数を別の呼び出しで呼び出します。 Cのポインタの詳細http://www.fredosaurus.com/notes-cpp/structs/arrow.html – Redu

0

まず最初に、プログラムがいつ関数に入るかを知っていると思いますが、終了するまで終了しません。その後、コードとその実行を分析することができます。

ifステートメントでNULL条件が原因でポインタを操作していると仮定し、各要素には左右の子へのポインタが2つありますが、nullでもかまいません。

まず、関数は最初の要素(番号1)を解析し、ifがnullであるかどうかを調べ、if文に入力し、その値を出力して左の子に移動し、プロセスを繰り返し、if 4はヌルですが、そうでない場合、ifステートメントに入力してその値を出力し、その左の子に移動します。これは要素4の子がnullの場合に再帰的なマジックが発生し、関数が戻り、 。その後、番号4の要素のレベルに戻り、それがヌルであるので番号1のレベルに戻り、チェック番号1の右の子を知り、いつものように続行して、右の子をチェックする。

あなたが再帰的なレベルを想像しなければなりませんし、あなたが前のものに戻ったときには、再帰的なものがなくなるまで通常の実行を続けます。

あなたが何かを理解していないと、それがあなたを助けてくれて、ごめんなさい。

+0

要素4の子がnullの場合の返信用のThanls ""関数は返り値を返し、再帰的な ""を続行しません。この点だけで説明できますか?左の子について行われたチェックはどこですか? –

+0

まず第一に、コンパイラはそれをチェックしません。実行時に発生します。要素4には、nullの場合でもleftChildとrightChildの2つのポインタがあります。 関数がleftChildで呼び出されたときにnullがあるかどうかをチェックし、要素4に子がない場合はnullであるため、レベル4に戻って右の子と繰り返しをチェックします。すべての子をチェックすると、関数はifステートメントを終了し、レベル2まで上がり、繰り返されます。 – Nestoraj

+0

返事をありがとう。だから、再帰の代わりにそれが単なる関数呼び出しであると仮定します。 funcに似ています(tree-> left)。したがって、これが4に達した後に呼び出された場合、関数はパラメータでNULL値を取得し、実行を開始しますか????それは通常の実行方法です。だから、どのように再帰は実行時にnullをチェックする特権を持っていますか? –