5

サイトのルールに従ってこれを行うことが許可されているかどうかはわかりません...しかし、私はチャンスをつかみます...ご容赦ください、私はただの学生です... :-)

大学の課題があります...授業で何をすべきかを理解するのに苦労しています...私は3回先生のところに行きましたが、彼から得た答えはまったく役に立ちませんでした. とにかく、割り当ての詳細は次のようになります...

Treeノードのコンテナーとして機能するというクラスを作成します。ツリー クラスは、次のメソッドをサポートする必要があります。

public void add(Node parent, Node child){} -- 新しい子ノードを親ノードに追加します

public void removeChild(Nodeparent, Node child){} -- 親から子ノードを削除します。

public Node getRootNode(){} -- ツリーのルートを返す

public void setRoot(Node root){} -- ツリーのルート ノードを設定する

public boolean contains(T data){} -- 指定されたタイプのツリーを検索します

public void dfs(Node child){} -- ツリーの深さ優先検索を実行し、各ノードを出力します (インデント)

public void bfs(Node child){} -- ツリーの幅優先検索を実行し、各ノードを出力します (インデント)

  1. ツリー クラスは、ジェネリック型 T を処理するようにパラメーター化する必要があります。これにより、文字列、ファイルなどのツリーを作成できます。Tree<String> tree = new Tree<String>()
  2. ツリー クラスは、隣接リストを使用してツリー構造を実装し、次のように定義する必要があります。Map<Node<T>, List<Node<T>>> tree = new HashMap<Node<T>, List<Node<T>>();

ジェネリック型 T を処理し、いくつかのメソッドを公開するには、ノード クラスもパラメーター化する必要があります...

今、私は正常に動作する Node クラスを作成しました...正直に言うと、ツリーを作成する Node クラスを作成したと確信していました。しかし、Tree クラスの説明を読んだ後、私は混乱しています。ツリーマップに何を保存する必要がありますか。全体を視覚化するのに苦労しています。

おそらく、誰かが先生が何を望んでいるかを説明し、私を正しい方向に導くことができます. 私はコード自体を探しているわけではありません...私が何をすべきかを理解したいだけです。

私のノードクラス

public class Node<T> 
{
    private Node<T> root; // a T type variable to store the root of the list
    private Node<T> parent; // a T type variable to store the parent of the list
    private T child;
    private List<Node<T>> children = new ArrayList<Node<T>>(); // a T type list to store the children of the list

    // default constructor
    public Node(T child)
    {
        setParent(null);
        setRoot(null);
        setItem(child);
    }

    // constructor overloading to set the parent
    public Node(Node<T> parent)
    {
        this.setParent(parent);
        //this.addChild(parent);
    }

    // constructor overloading to set the parent of the list  
    public Node(Node<T> parent, Node<T> child)
    {
        this(parent);
        this.children.add(child);
    }

    /**
    * This method doesn't return anything and takes a parameter of 
    * the object type you are trying to store in the node 
    * 
    * @param  Obj  an object
    * @param 
    **/
    public void addChild(Node<T> child)
    {
        child.root = null;
        child.setParent((Node<T>)this);
        this.children.add(child); // add this child to the list
    }

    public void removeChild(Node<T> child)
    {
        this.children.remove(child); // remove this child from the list
    }

    public Node<T> getRoot() {
        return root;
    }

    public boolean isRoot()
    {
        // check to see if the root is null if yes then return true else return false
        return this.root != null;     
    }

    public void setRoot(Node<T> root) {
        this.root = root;
    }

    public Node<T> getParent() {
        return parent;
    }

    public void setParent(Node<T> parent) {
        this.parent = parent;
    }

    public T getItem() {
        return child;
    }

    public void setItem(T child) {
        this.child = child;
    }

    public boolean hasChildren()
    {
        return this.children.size()>0;
    }

    @SuppressWarnings("unchecked")
    public Node<T>[] children()
    {
        return (Node<T>[]) children.toArray(new Node[children.size()]);
    }

    @SuppressWarnings({ "unchecked"})
    public Node<T>[] getSiblings()
    {
        if(this.isRoot()!=false && parent==null)
        {
            System.out.println("this is root or there are no siblings");
            return null;
        }
        else{
            List<Node<T>> siblings = new ArrayList<Node<T>>((Collection<? extends Node<T>>) Arrays.asList(new Node[this.parent.children.size()]));  
            Collections.copy(siblings, this.parent.children);  
            siblings.remove(this);
            return siblings.toArray(new Node[siblings.size()]);
        }
    }
}
4

3 に答える 3

8

次の目的でマップを使用します。

ハッシュマップのキーは特定のノードであり、ハッシュマップの値は特定のノードの子ノードです。

public class Tree<T> {
    private Node<T> rootNode;
    private HashMap<Node<T>, List<Node<T>> tree;

    //and then some kind of function to go through the tree.
    public void expandNode(Node<T> node) {
        if (tree.get(node) == null) {
            System.out.println(node);
            return;
        }
        for(Node<T> n : tree.get(node)) {
            System.out.println(node);
            expandNode(n);
        }
    }
}

ツリーがどのように機能するかを明確にできますか??

于 2012-04-24T01:41:02.860 に答える
0

リストの 2 つのポイントを見ると、1 番のポイントが最もわかりにくいと思います。

ツリー自体はパラメータ化できます。ツリー クラスの型パラメーターは、ノードの作成に使用される内部クラス内で使用できます。つまり、割り当ての目的で、ノード クラスはおそらく Tree クラス内にある必要があるため、Tree クラスに指定された T 型パラメーターを使用できます。

そうすれば、ツリーはあらゆるもの (文字列、ファイル、Double など) を格納できます。Node クラスは、任意の T 型オブジェクトを格納するための優れた方法として単純に機能します。

于 2012-04-24T01:44:21.623 に答える
0

これは少し奇妙です。私がこれを行っていて、割り当てに別のことが書かれていない場合、おそらく Tree クラスをまったく作成しませんでした。Node を再帰的なデータ構造として使用し、ツリーのルート ノードがツリー全体を表すようにします。

これを行うことになっているようには見えないので、単一のオブジェクトTree<T>への参照を持つラッパー クラスを作成することができます。Node<T>必要なメソッドのロジックは、どちらのクラスにも配置できます。

コードの冒頭は次のようになります。

public class Tree<T> {

    private Node<T> root;

    public Tree(Node<T> root) {
        this.root = root;
    }

}
于 2012-04-24T01:49:32.520 に答える