0

これは私のデータ構造クラスの宿題用であり、Javaで作成されています。

私はこの小さなゲームを一種のものにしなければなりません。ワールドはグラフで構成されており、一部のノードにはアイテムが保持されており、見つかった場合は、バイナリ検索ツリーであるユーザーのインベントリに追加されます。(それは二分探索木でなければなりません、さもなければこれははるかに簡単でしょう。)私はそれのほとんどを理解しました、しかし私はユーザーが在庫ツリーのものの内容を見てそしてアクセスできるようにする必要があります。私が提供するバイナリツリーノードクラスには、inorderPrint()再帰を使用してすべてを出力するメソッドがありますが、これはコンテンツを表示するのに役立つだけであり、簡単にアクセスする方法はありません。二分探索木のノードの配列を返すメソッドが欲しいので、メインでこのようなことを行うことができます...

int i = 0;
int choice;
System.out.println("# - Item\tPoints"); //Will appear as # - Item     Points
for (BTNode node : inventory.treeAsArray()) {
    System.out.printf("%d - %s\t%d\n", i, node.getData().getName(),
                      node.getData().getPoints()); //example: 1 - Poo    100
    i++;
}

System.out.println("Select the number of the item you want to remove: ");
choice = keyboard.nextInt();

次に、配列をもう一度ループして、ユーザーが入力した番号に対応する項目を削除します。ただし、バイナリ検索ツリーの内容を配列の形式で返すメソッドを作成する方法はわかりません。それが私の主な問題です。教科書でそのアルゴリズムを見つけることができません。

4

2 に答える 2

1

これを行う場合は、おそらく配列をすべてのノードに順番に渡すだけです。

public ArrayList<BTNode> treeAsArray() {
    ArrayList<BTNode> list = new ArrayList<BTNode>();
    root.buildListInorder(list);
    return list;
}

そして持っている

private void buildListInorder(ArrayList<BTNode> list) {
    buildListInorder(this.left);
    list.add(this);
    buildListInorder(this.right);
}

適切なチェックを追加する必要がありますが、それが必要なコードの基本的な概要です。

于 2012-05-06T06:38:20.410 に答える
0
public List<BTNode> treeAsArray() {
     return treeAsArray(this.root, new ArrayList<BTNode>());
}

private List<BTNode> treeAsArray(BTNode root, List<BTNode> array) {
     if (root == null)
         return array;

     treeAsArray(root->getLeftNode(), array);
     array.add(root);
     treeAsArray(root->getRightNode(), array);

     return array;
}
于 2012-05-06T06:39:55.650 に答える