はい!同じノードの2人の子供の間には、direct
リンクはありません。
上記の再帰コードを手助けするには、geeksforgeeksから取得した次の画像を見てください。あなたがそこに到達する方法を知っているようなので、上などの、今、それが戻ってその親に動いているかを理解しましょうと、一番左のノードにストレートジャンプ
。
if(root!=NULL)
が左の子となり、4
の右の子がnullなので、あなたは間違いなく次の行から出てくるでしょうが、それでもそれは得られませんか?次の説明を参照してください。
preOrder(root->left)
とあなたは今まで
このラインの下にあるものを見ていない:
さて、あなたはこのケースで4
ある左端のノードであり、このノードに到達するための責任がある行があります
つまり、あなたは次の行を見たことがありません。
preOrder(root->right);
4
の
左の子は、null
であるための再帰条件ブレークとあなたが最終的にpreOrder(root->right);
.Thisは魔術のいくつかの種類ではありませんを参照、これは再帰が何であるかです。今すぐあなたが4
の右の子供を見るときnull
です。うまく
、今ルートの値は何ですか? 2
が最初の場所で4
にあなたを取った唯一の値であるため、
ルートの値は2
です。再帰はレベル内のレベルと似ており、最後のレベルが終了すると、そのコールはそれより上のレベルに戻ります。2
は4
です。最後に、次の行は右の子の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
を、私は読んで再帰を学び、その後、上記に近づくためにあなたに助言しますもう一度問題。
再帰関数の働きを検索する必要があります。それはあなたにヒントを与えます(ヒント:スタック関連)。 – Javia1492
再帰の定義については、再帰を参照してください。 –
@ Yan.Fそれは間違っています。各サブノードは反復ごとに印刷されません。これは再帰的に呼び出され、左のノードをヌルノードまで印刷し、次に右の子ノードをヌルまで印刷します。 – Javia1492