0

いらっしゃいませ!ツリーノード(実際には検索ツリーではなく、元のバイナリツリー)を受け取るlessという名前の再帰的なパブリック静的メソッドと、ツリー内のすべての値が整数未満の場合に返されるintパラメーターがあります。したがって、私はSoを使用しますpublic class TN { public int value; public TN left, right; public TN(int v, TN l, TN r) {value = v; left = l; right = r;} } 。私のメソッドは、次のようになります。

public static boolean less(TN s, int toFind){
if (s == null)
   return true;
else{ 
 if(s.value <= toFind)  
   return less(s.left, toFind) && less(s.right, toFind);  // right here do I return true? or do I have to somehow recall recursively
 else  
   return false; 
}

私はそれが正しいのか、それとも何かが足りないのか疑問に思いましたか?trueとfalseを返す必要がありますか?

4

4 に答える 4

2

これを書くためのもっとエレガントなOOの方法があります。私の推奨は、クラスless()の非静的メンバー関数を作成することです。TNこのように、ツリーのルートノードが呼び出されrootた場合は、を呼び出すだけroot.less()です。を呼び出すたびに、とless()が呼び出さleft.less()right.less()ます。

コンパイルすらできないサンプルコードを投稿したので、IDEを使用しているのか、それとも。を使用してクラスをコンパイルしようとしたのか疑問に思いますjavac。Javaを初めて使用する場合は、Eclipse、Netbeans、または別のIDEを入手することを強くお勧めします。

于 2009-10-16T18:56:24.670 に答える
1
return less(s, toFind); 

する必要があります:

return less(s.left, toFind) && less(s.right, toFind);

関数が静的である理由がわかりません。

前に述べたように、最初の部分は次のようになります。

if (s == null) return true;

(編集:これにより、すべてのノードが条件を満たす場合に真の結果を得ることができます。そこに==があり、これは<である必要があります)。編集:わかりました、あなたは私が言及したものよりも多くの問題を抱えています。コードを論理的にステップスルーする必要があります。

ツリーをトラバースする必要があるため、子ノードで関数を呼び出す必要があります。次に、デフォルトの結果としてtrueを返す必要があります。そうすれば、探している数よりも多い数に達したときに、子をトラバースせずにすぐにfalseを返すことができます。私はあなたがそれの残りを自分で通り抜けるための論理であなたを十分に助けたことを願っています。

于 2009-10-16T18:52:48.413 に答える
0

まず、の値をに設定するのではなく、比較を行っているとおりにするif (s = null)必要があります。if (s == null)snull

ステートメントreturn less(null, toFind);はメソッドを呼び出し続けます-スタックをオーバーフローさせます。

于 2009-10-16T18:50:53.230 に答える
0

true再帰を終了するたびに戻るので、関数が戻る方法がないことに注意してくださいfalse。そして、問題はあなたの最初のチェックにあります。「ツリー内のすべての値が整数よりも小さい」と言います。ええと、空のツリーでは、すべての値(その中にはありません)は実際にはどの整数よりも小さいので、その場合は返す必要がありますtrue

また、「未満」と言っている間は、等しいかどうかを比較しているので、実際には、すべての値が整数以上であるかどうかをチェックしています。

于 2009-10-16T19:02:42.447 に答える