2012-03-04 16 views
3

整数を読み込んで昇順に出力するmain関数を定義する必要があります。AVLツリーから昇順(ソート)で印刷する

For example, if the input contains 

     12 
     4 
     19 
     6 

    the program should output 

     4 
     6 
     12 
     19 

ただし、これを行うにはツリーを使用する必要があります。私は2つの機能insertavldeleteavlを私の処分で使用しました。それらの定義はそうです... http://ideone.com/8dwlU基本的にdeleteavlが呼び出されるとノードが削除され、それに応じてツリーのバランスが再調整されます ...興味があるのはhttp://ideone.com/QjlGeです。

私はこれまでのところ、これを得ている:

int main (void) { 
    int number; 
    struct node *t = NULL; 
    while (1 == scanf("%d",&number)) {  
      t = insertavl(t, number);    
    } 
    while (t != NULL){ 
     printf("%d\n",t->data); 
     t = deleteavl(t, t->data);  
    }  
} 

しかし、これは昇順に印刷されません。どんな提案も役に立つでしょうか?前もって感謝します!

答えて

3

ヒント:昇順の要素を反復BSTあるin-order traversal

AVLツリーはBSTの特定の実装であるため、ここでも同様です。

EDIT:説明 - BSTでの順序通りのトラバーサルのこのプロパティが正しい理由は何ですか?

in-order trvaersalでは、左のサブツリーのすべてのノードにアクセスした後に、各ノードに[印刷する]アクセスします。 BSTではルートが左のサブツリーのすべてのノードよりも大きいので、それは私たちが望むものです。

また、順序通りのトラバーサルでは、右のサブツリーのすべての要素にアクセスする前に各ノードにアクセスし、BSTであるため再度アクセスします。これはまさに私たちが望むものです。

(*)注:これは正式な証拠ではなく、それが本当である理由を直感的に説明しています。

+0

?私はツリーを昇順で整列するためにinorder関数を使うようにした後で、私はすべてする必要がありますか? – Thatdude1

+0

@Beginnernato:添付されているwikipediaへのリンクを見てください。それは順序通りのトラバーサル関数の擬似コードを持っています。私の意見ではかなり簡単です。 [プログラムの他の部分にバグがない限り]それを実装して実行してください。 – amit

+0

@ Beginnernato:BSTのこのプロパティの説明を追加しました。そう、はい、あなたがする必要があるのは、順番のトラバースで要素を印刷することです。 – amit

関連する問題