2015-05-28 75 views
0

我必須創建一個具有多個子節點的父節點的樹結構,並且每個子節點也可以有其子節點。每個節點將通過其唯一的ID和名稱進行標識。用Java中的值顯示樹的層次結構

因此,當我從層次結構中輸入任何id時,應打印所有節點id和它們的子節點id。我怎樣才能做到這一點(任何示例代碼都會有所幫助)以及哪些集合應該從集合框架中使用,還是必須在Java中使用純數據結構?

+0

據我所知,有外的開箱沒有在JDK解決方案樹(必有庫,但)。但是樹基本上是一個'Node',它具有一些屬性(你的名字和ID)和一個代表孩子的'List '。最難的部分將是基於其ID來高效地檢索節點。我相信谷歌搜索應該爲你提供大量的例子。 – Chop

回答

2

一種可能的方法是創建自己的樹結構(包含子節點的節點)並將其包裝到另一個跟蹤節點ID的結構中。類似的東西:

public class Tree<I, A> { 
    private final HashMap<I, Node<I, A>> map = new HashMap<>(); 
    private final Node<I, A> root; 

    public Tree(I id, A value) { 
     root = new Node<>(id, value); 
     map.put(id, root); 
    } 

    public void addChild(I parentId, I id, A value) { 
     Node<I, A> parent = map.get(parentId); 
     Node<I, A> child = new Node<>(id, value); 
     parent.children.add(child); 
     map.put(id, child); 
    } 

    public A getById(I id) { 
     return map.get(id).value; 
    } 

    public String subtreeToString(I id) { 
     return map.get(id).toString(); 
    } 

    private static class Node<I, A> { 
     private final I id; 
     private final A value; 
     private final ArrayList<Node<I, A>> children = new ArrayList<>(); 

     private Node(I id, A value) { 
      this.id = id; 
      this.value = value; 
     } 

     private void print(int depth, PrintWriter pw) { 
      for (int i = 0; i < depth; i++) { 
       pw.print("\t"); 
      } 
      pw.println("[" + id + ", " + value + "]"); 
      for (Node<I, A> child : children) { 
       child.print(depth + 1, pw); 
      } 
     } 

     @Override 
     public String toString() { 
      StringWriter writer = new StringWriter(); 
      print(0, new PrintWriter(writer)); 
      return writer.toString(); 
     } 
    } 
} 

用法:

Tree<Integer, String> tree = new Tree<>(1, "Bob"); 

tree.addChild(1, 2, "John"); 
tree.addChild(1, 3, "James"); 
tree.addChild(2, 4, "David"); 
tree.addChild(2, 5, "Alice"); 

System.out.println(tree.subtreeToString(1)); 
System.out.println(tree.subtreeToString(2)); 

輸出:

[1, Bob] 
    [2, John] 
     [4, David] 
     [5, Alice] 
    [3, James] 

[2, John] 
    [4, David] 
    [5, Alice] 
0

你必須使自己的樹結構和打印時,只需調用toString()的父節點上,並從該節點調用toString()的兒童等

0

威力一些結構準備好了任務,但在另一方面:這個任務是非常簡單的做自己 - 只是做一個遞歸有序走下樹​​:

  1. 開始根節點
  2. 如果有一個左節點:輸入它並轉到2.
  3. 其他:打印內容。
  4. 如果有一個合適的節點:進入它,去2
  5. 否則:返回

好運。