2017-04-02 9 views
0

私のツリーが正しく挿入されているかどうかをテストし、疑似古典的なインスタンス化を使ってこの作業を行っています。私の問題は、デバッガが真実がtrueに設定されていることを私に教えてくれることです。関数の最後から真理値を返すと、私は偽になります。私は考えることができるすべてを試しましたが、なぜこれが起こっているのか理解できません。バイナリ検索ツリーを検索するコードは次のとおりです。リターンとラインを更新しましたバイナリ検索ツリーを再帰するときに正しく値を返すことができません

var valuetest; 
 
    var truth = false; 
 
    if (this.value === value) { 
 
    var truth = true; 
 
    return truth; 
 
    } else if (value > this.value) { 
 
    valuetest = this.right.value; 
 
    if (valuetest === value) { 
 
     truth = true; 
 
     return truth; 
 
    } else { 
 
     this.right.contains(value); 
 
    } 
 
    } else { 
 
    valuetest = this.left.value; 
 
    if (valuetest === value) { 
 
     truth = true; 
 
     return truth; 
 
    } else { 
 
     this.left.contains(value); 
 
    } 
 
    } 
 
    return truth; 
 
    //returns false even if truth is set to true for some reason.

+1

更新 'this.right.contains(値);' '戻りthis.right.contains(値);'と左と同じ。 –

+0

またNULLをチェックしていません(つまり、ツリーの終わり) –

+0

ありがとうございました。あなたのソリューションはうまくいきました。今はnull実装チェックを理解する必要があります。 – Milos

答えて

1

。このスニペットを試してください。

1

var valuetest; 
 
    var truth = false; 
 
    if (this.value === value) { 
 
    var truth = true; 
 
    return truth; 
 
    } else if (value > this.value) { 
 
    valuetest = this.right.value; 
 
    if (valuetest === value) { 
 
     truth = true; 
 
     return truth; 
 
    } else { 
 
     return this.right.contains(value); 
 
    } 
 
    } else { 
 
    valuetest = this.left.value; 
 
    if (valuetest === value) { 
 
     truth = true; 
 
     return truth; 
 
    } else { 
 
     return this.left.contains(value); 
 
    } 
 
    } 
 
    return truth; 
 
    //returns false even if truth is set to true for some reason.

あなたが return再帰呼び出しを忘れてしまいました。だから thruthが真になっていますが、再帰から一レベル戻って、 真実変数には変数があり、全く設定されません。

また、平等チェックを繰り返すことでarm's length recursionを実装しましたが、ここでは実際には必要ありません。

return value === this.value || 
     value > this.value && this.right && this.right.contains(value) || 
     value < this.value && this.left && this.left.contains(value); 

値が見つからない場合、再帰は停止する必要があります。あなたが葉を表すときvaluenullまたはundefinedであるように木を構築した場合、上記はうまくいくでしょう。

または、その方向に子がもうない場合は、leftおよび/またはrightプロパティを省略することができます。また、ツリーがそのように構築されている場合は、上記のコードが機能します。

または静止ビット賢く:

const branch = this[value > this.value ? 'right' : 'left']; 
return value === this.value || branch && branch.contains(value); 
関連する問題