2017-06-26 9 views
1

これは先行順走査するためのコードで - 私たちは左の最後のノードに到達したらツリートラバーサルの仕組みは?

void preOrder(node *root) 
{  
    if(root!=NULL) 
    { 
     cout<<root->data<<" "; 
     preOrder(root->left); 
     preOrder(root->right); 
    }   
} 

、それはどのように右のノードに行くのですか?私は左と右のノードの間にリンクがないことを意味しますが、両方とも同じ親を持ちますが、最後のノードに到達した後、どのように親に戻るのでしょうか?

+0

再帰関数の働きを検索する必要があります。それはあなたにヒントを与えます(ヒント:スタック関連)。 – Javia1492

+3

再帰の定義については、再帰を参照してください。 –

+1

@ Yan.Fそれは間違っています。各サブノードは反復ごとに印刷されません。これは再帰的に呼び出され、左のノードをヌルノードまで印刷し、次に右の子ノードをヌルまで印刷します。 – Javia1492

答えて

2

はい!同じノードの2人の子供の間には、directリンクはありません。

上記の再帰コードを手助けするには、geeksforgeeksから取得した次の画像を見てください。あなたがそこに到達する方法を知っているようなので、上などの、今、それが戻ってその親に動いているかを理解しましょうと、一番左のノードにストレートジャンプ

enter image description here

if(root!=NULL)が左の子となり、4の右の子がnullなので、あなたは間違いなく次の行から出てくるでしょうが、それでもそれは得られませんか?次の説明を参照してください。

preOrder(root->left)とあなたは今まで

このラインの下にあるものを見ていない:

さて、あなたはこのケースで4ある左端のノードであり、このノードに到達するための責任がある行があります

つまり、あなたは次の行を見たことがありません。

preOrder(root->right);4

左の子は、nullであるための再帰条件ブレークとあなたが最終的にpreOrder(root->right); .Thisは魔術のいくつかの種類ではありませんを参照、これは再帰が何であるかです。今すぐあなたが4の右の子供を見るときnullです。うまく

、今ルートの値は何ですか? 2が最初の場所で4にあなたを取った唯一の値であるため、

ルートの値は2です。再帰はレベル内のレベルと似ており、最後のレベルが終了すると、そのコールはそれより上のレベルに戻ります。24です。最後に、次の行は右の子2になります。これは5です。

preOrder(root->right);

奪う:

1)あなたはcout<<root->data<<" ";を見るたびに、あなたは現在のルートの値を出力します。

2)preOrder(root->left);が表示されるたびに、ルートの左の子に移動します。

3)preOrder(root->right);が表示されるたびに、ルートの右の子に移動します。

4)ルートの値がNULLの場合、何もしないと、preOrder(root->left);またはpreOrder(root->right);のいずれかになる呼び出し元の回線に戻ります。

は、我々はあなたがなり与えられたバイナリツリーの先行順走査推測できる上に、私が言ったことに従えば:今

1 2 4 5 3

を、私は読んで再帰を学び、その後、上記に近づくためにあなたに助言しますもう一度問題。

+0

ありがとうShivam。私は昨日の再帰でいくつかのビデオを見て、今どのように動作するか知っています。上記のコードの 'if(root!= NULL)'と 'if(root == NULL)return;の違いを教えてください。 –

+0

(ルート!= NULL)が再帰ブレーク条件である場合。 forループと同様に、再帰でもチェック条件があります。あなたが** 4 **の左の子供を訪問するとき、それは* NULL *であり、それはその瞬間に壊れなければなりません。 –

0

あなたは関数を再帰的に呼び出しています。 preOrderへの各呼び出しは、スレッドの実行スタック上でフレームと呼ばれるものを作成します。これらのフレームは、ツリー内の各パスに従います。関数からreturnを呼び出すと、その呼び出しフレームがスタックから削除され(または「ポップ」され)、コントロールは前のフレームに戻ります。

これは、リーフに到達すると、親に、そして兄弟サブツリーに(「preOrder」への2番目の呼び出しを介して)「バックトラック」することです。あなたが話す「リンク」は、実際には実行スタック上に作成されます。