2017-09-10 9 views
-1

私はmake関数を使って、バイナリツリー、t、2つの整数a、bを取得し、aとbの間にある整数を出力します。私の関数(バイナリツリー上)が予期しない結果を出力するのはなぜですか?

ここでの例はバイナリツリーです。 3つのノードおよびデータ: 10,15,20。 私は、たとえば、この関数を呼び出す..(トン、10、20)の間に、結果として私は数1を期待するが、これは起こりません My機能は次のとおりです。

` 
int between (tree t, int a, int b) { 
    if (t== NULL) 
     return 0; 
    if ((t->data >a) && (t->data <b)) 
     return 1 + between(t->left,a,b) + between(t->right,a,b); 
} 

誰も私を説明できますか?

+0

コードを1行ずつデバッガでステップ実行したとき、あなたは何を観察しましたか? – user0042

+0

ルートが範囲内にない場合でも、範囲内にある数がサブツリーに存在することがあります。例えば。あなたの例では、ルートが10、右が15、右が20の不均等なツリーを持つことができます。この場合、コードはツリーを見下すことさえありません。 –

+1

さらに、 'return'ステートメントに遭遇することなく、' void'関数の終わりに達することによって、あなたのプログラムは未定義の動作を示すかもしれません。 2つの条件のどちらも成立していない場合は、何も返しません。 –

答えて

0

まず、数字がaとbの間にない場合、戻り値を定義していません。これはプログラム以外のエラーですが、必要であればエラーはありませんが、関数はintの値を返します。

第2に、値が範囲内にない場合は、続行する必要があります。 あなたの関数は次のようになります。左の値が右(探索木)上の値よりも低い

int between (tree t, int a, int b) { 
    if (t== NULL) 
     return 0; 
    if ((t->data >a) && (t->data <b)) 
     return 1 + between(t->left,a,b) + between(t->right,a,b); 
    else return between(t->left,a,b) + between(t->right,a,b); 

} 

いっそのこと、場合は改善を行うことができます。

int between (tree t, int a, int b) { 
    if (t== NULL) 
     return 0; 
    if ((t->data >a) && (t->data <b)) 
     return 1 + between(t->left,a,b) + between(t->right,a,b); 
    else if(t->data<a) 
     return between(t->right,a,b); 
    else if(t->data>b) 
     return between(t->left,a,b); 
} 
関連する問題