我必須創建一個具有多個子節點的父節點的樹結構,並且每個子節點也可以有其子節點。每個節點將通過其唯一的ID和名稱進行標識。用Java中的值顯示樹的層次結構
因此,當我從層次結構中輸入任何id時,應打印所有節點id和它們的子節點id。我怎樣才能做到這一點(任何示例代碼都會有所幫助)以及哪些集合應該從集合框架中使用,還是必須在Java中使用純數據結構?
我必須創建一個具有多個子節點的父節點的樹結構,並且每個子節點也可以有其子節點。每個節點將通過其唯一的ID和名稱進行標識。用Java中的值顯示樹的層次結構
因此,當我從層次結構中輸入任何id時,應打印所有節點id和它們的子節點id。我怎樣才能做到這一點(任何示例代碼都會有所幫助)以及哪些集合應該從集合框架中使用,還是必須在Java中使用純數據結構?
一種可能的方法是創建自己的樹結構(包含子節點的節點)並將其包裝到另一個跟蹤節點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]
你必須使自己的樹結構和打印時,只需調用toString()的父節點上,並從該節點調用toString()的兒童等
有威力一些結構準備好了任務,但在另一方面:這個任務是非常簡單的做自己 - 只是做一個遞歸有序走下樹:
好運。
據我所知,有外的開箱沒有在JDK解決方案樹(必有庫,但)。但是樹基本上是一個'Node',它具有一些屬性(你的名字和ID)和一個代表孩子的'List'。最難的部分將是基於其ID來高效地檢索節點。我相信谷歌搜索應該爲你提供大量的例子。 –
Chop