2017-01-25 11 views
1

私は既に作成したバイナリ検索ツリーの助けを借りていくつかのデータを並べ替えたいです。 私は、次の例のコードが動作します..しかし、これがどのように動作するのか理解できません。 データベースにレコードが存在しない場合はb = 0と戻ります。これは明らかです。 bが存在する場合は、左ノードに戻り、b-> left == NULLになるまで関数を何度も呼び出します。正しく取得できますか? しかし、とき、それはそれは、印刷をdoesntの機能を実行しますが、関数の先頭から再び開始したとき、私は何を得るのため、..バイナリ検索ツリーソート

void display_ordered_email(struct BST_node *b) 
{ 
    if (b==0)   
     return;    
    display_ordered_email(b->left); 
    printf("Name : %s\n", b->data->name); 
    printf("Address : %s\n", b->data->address); 
    printf("Email : %s\n", b->data->email); 
    printf("\n"); 
    display_ordered_email(b->right); 
} 

このINORDERトラバーサルまたはその他の方法か、データを印刷しませんか

+0

最初のNULLに達してから戻ると、最後に再帰的に呼び出された場所に戻ります。これは、コード例の5行目です。つまり、最初のprintfステートメントである6行目に続きます。それはあなたが「いつデータを印刷するのですか...」と言ったときに求めていることですか? –

答えて

1

この単純なツリーを考えてみましょう。 display_ordered_emailを再帰的に順にノードを印刷することになっているbを印刷しなければならないとき、あなた自身に尋ねることができることを考えると

b 
/\ 
a c 

。答えはa(左側)を訪問して印刷した後で、c(右側)を訪問して印刷する前に、bを印刷する必要があります。

void display_ordered_email(struct BST_node *b) 
{ 
    if (b==0)   
     return;    
    display_ordered_email(b->left); 
    /* ... print the node */ 
    display_ordered_email(b->right); 
} 

これはあなたのルーチンがどのように構成されているかを正確に示しています。

1

これは、再帰を使用した予約注文トラバーサルです。左のサブツリーで作業が完了すると、そのサブツリーのルートとそれに続く右のサブツリーが出力されます。約8ノードのツリーで試してみてください。

1

左下まで移動して0を押すと、1つのノードに戻り、return文の後にそのノードのコードが続行されます。これは、そのコードを出力し、正しいノードで試すことを意味します。正しいノードがない場合はそれだけを返し、そうでない場合は正しいノードを出力します。両方の作業が完了したら、1つのレベルをバックアップし、そこにあるすべてのものを印刷して、それが持つ可能性のあるブランチの正しいブランチをチェックします。

最初はかなり混乱していますが、それを描くと分かりやすくなります。

+0

それはルートの左のサブツリーに行きます。左側のサブツリーがなくなるまで下がり、そのノードを印刷します。しかし、そこからループが進み、前の場所にある他のノードが印刷されますか? – ritgeo

+1

display_ordered_email(b-> left); これはツリーのサイズによって数回呼び出されます。最初の2〜3回は、ノードに戻るまで何もしません。それがヌルノードに達すると、それは上にあるノードに戻り、 "display_ordered_email(b-> left);を終了する。その下位ノードの部分。それで、そのノードのコードを実行します: printf( "名前:%s \ n"、b-> data-> name); ... display_ordered_email(b-> right); –

+1

コメントのために最大文字をクリックしてください申し訳ありませんが、また: "display_ordered_email(b-> right);"は正しいノードをチェックするために同じことを行い、もし存在しない場合はそのコードのチャンクが終了し、 1つのノード。ただし、正しいノードが存在する場合は、再び左と右のノードが検索されます。 –