2012-04-24 3 views
5

私と一緒に負担してください...私は、サイトの規則に従ってこれを実行させて頂く場合か分からない...しかし、私は私のチャンスを取る、私は学生です。.. 。:-)ツリーノード<T>の、について説明

は、私はクラスが何をすべきか理解に苦労しています...大学の割り当てを持っている...私は、3つの異なる機会に私の先生に行っていると私は彼から得た答えはありませんでした助けてください。とにかく割り当ての詳細が続くようになり...

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

公共ボイド追加(ノードの親ノードの子){} - は親ノード

公共ボイドのremoveChild(Nodeparent、ノードの子){}に新しい子ノードを追加します - 親ノードから子ノードを削除します。

パブリック・ノードgetRootNode(){}は - ツリー

公共ボイドsetRoot(ノードルート){}のルートを返し - ツリーのルートノードを設定

{}所与のタイプのツリーを検索

公共ボイドDFS(ノード子) - - パブリックブール(Tデータ){}が含まTREの深さ優先検索を実行します各ノード(インデント)

  1. ツリーと出力の幅優先探索を実行 - 各ノード(インデント)

    公共ボイドBFS(ノードの子){}はEと出力ツリークラスは、ジェネリック型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()]); 
     } 
    } 
} 
+8

「ベア」:

コードの先頭には、次のようなものを見ることができますか?私は服を着たままにしています。 – duffymo

+0

:-)良いもの.... –

+0

便利な区別が1つあります:[this](http://en.wikipedia.org/wiki/Tree_%28data_structure%29)種類のツリー、[this ](http://en.wikipedia.org/wiki/Tree_%28graph_theory%29)種類の木?私は前者を推測していただろうが、隣接リストを使うという要件は後者を示唆している。 – Taymon

答えて

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); 
     } 
    } 
} 

ツリーの仕組みを明確にすることはできますか?

+0

hmmmm 私のNodeクラスでは、配列内の子を返すメソッドを作っています。ノードとしてをキーとして配置し、ノードの子を配列として配置します。 –

+1

このように考えると、ハッシュマップはツリー全体であり、ルートノードへの言葉遣いを保つことができます。次に、このように動作し、与えられたノードを持ち、ハッシュマップのget mehtodを呼び出して子を取得しますそのノードの子を取得し続けるために同じマップを使用することができます.getメソッドがnullを返すと、リーフノードがあります。 –

+0

もう一つの詳細は、動作させるために、Nodeクラスにequalsメソッドとhashcodeメソッドを実装する必要があります。 –

0

リストの2つの点を見ると、ポイント番号1が最も混乱していると推測します。

ツリー自体をパラメータ化することができます。ツリークラスの型パラメーターは、ノードの作成に使用される内部クラスの内部で使用できます。つまり、代入の目的のために、Treeクラスに与えられたT型パラメータを使用できるように、ノードクラスはおそらくTreeクラスの内部にあるべきです。

このように、ツリーには何か(文字列、ファイル、ダブルスなど)を格納できます。 Nodeクラスは、任意のタイプTオブジェクトを格納するための素晴らしい方法として機能します。

+0

あなたは混乱の部分について正しいです... :-)説明では、ノードのための別のクラスを書くように求められます...私は書いています –

0

これは少し奇妙です。私がこれをやっていて、割り当てが別のことを言っていないなら、私はおそらくTreeクラスを全く書いていないでしょう。私はちょうどノードを再帰的なデータ構造として使用し、ツリーのルートノードをツリー全体を表すようにします。

Tree<T>は、Node<T>オブジェクトへの参照を持つラッパークラスにすることができます。どちらのクラスにも、必要なメソッドのロジックを置くことができます。あなたと

public class Tree<T> { 

    private Node<T> root; 

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

} 
+0

説明は、Treeクラスが私が書いたメソッドをサポートすべきだと明確に述べています私の元の投稿...しかし、私はTreeクラスの初期化ステートメントの例を教えてください...?してください...あなたが言ったことの周りに私の頭を手にしようとしている...この他の紳士のファンは、あまりにも意味を作っている... –

+0

並べ替えの例が追加されました。 – Taymon

+0

これはTreeクラスの作成を始めたばかりですが、マップの問題全体で混乱してしまいました。 –

関連する問題