[解決済み] バイナリサーチツリーの実装 - Containsメソッド
2022-02-02 19:21:01
質問
現在、DictionaryApp、BSTSet、BSTNodeの3つのクラスがあり、BSTSetとBSTNodeの両方がcontainsメソッドを持っています。
public class BSTSet <E extends Comparable<E>> extends AbstractSet <E> {
// the root of the supporting binary search tree
private BSTNode<E> root;
// number of elements in the set
private int count = 0;
public boolean isEmpty() {
return count == 0;
}
public boolean contains(E item) throws ClassCastException {
if(root == null) return false;
return root.contains(item);
}
public boolean add(E item) {
if (item == null)
throw new IllegalArgumentException("Null cannot be added to a BSTSet");
if(contains(item))return false;
if(root == null){
root = new BSTNode(item);
count++;
return true;
}else{
root.add(item);
count++;
return true;
}
}
}
public class BSTNode <E extends Comparable<E>> {
private E value;
private BSTNode<E> left;
public BSTNode<E> right;
public BSTNode(E value) {
this.value = value;
}
public E getValue() {
return value;
}
public BSTNode<E> getLeft() {
return left;
}
public BSTNode<E> getRight() {
return right;
}
public boolean contains(E item) {
if(item.compareTo(value) == 0) return true;
if(left != null) left.contains(item);
if(right != null) right.contains(item);
// no matching node was found
return false;
}
public boolean add(E item) {
if(item.compareTo(value) < 0) {left = new BSTNode(item); return true;}
if(item.compareTo(value) > 0) {right = new BSTNode(item); return true;}
return false;
}
}
私の問題は、BSTNodeクラスのcontainsメソッドが決してtrueを返さないことで、その理由が理解できません。もし、私のコードをもっと見たい、あるいはもっと情報が必要であれば、遠慮なく質問してください。
解決方法は?
あなたの
BSTNode
's
contains
メソッドを呼び出すと、その結果を無視することになります。
contains
で
left
と
right
. 子ノードがそれを見つけた場合は
true
をすぐに実行します。 また、比較の結果、次に検索する子を決定するために使用します。
public boolean contains(E item) {
int comp = item.compareTo(value);
if(comp == 0) return true;
if(comp < 0 && left != null && left.contains(item)) return true;
if(comp > 0 && right != null && right.contains(item)) return true;
// no matching node was found
return false;
}
あなたの
add
メソッドは、すでに存在する可能性のある子ノードを無視します。 まず、子ノードが存在するかどうかをテストします。 もし存在しなければ、すでにやっているようにそれを割り当てます。 もしそれらが既に存在するならば
add
その子に対して再帰的に
public boolean add(E item) {
if(item.compareTo(value) < 0) {
if (left == null) left = new BSTNode(item); return true;
else return left.add(item);
}
if(item.compareTo(value) > 0) {
if (right == null) right = new BSTNode(item); return true;
else return right.add(item);
}
return false;
}
関連
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】intがnullであるかどうかを確認する方法
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み】2分木と2分探索木の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】ResultSetの例外 - 結果セットの開始前
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】Javaメソッドスタブ
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)