显示树层次结构及其在 Java 中的值
Display tree hierarchy with their values in Java
我必须创建一个树结构,其中 parent 个节点有许多 children,每个 child 也可以有它们的 children。每个节点将由其唯一的 ID 和名称标识。
因此,当我从层次结构中输入任何 id 时,所有 node-ids 和他们的 child node-ids 以及他们的名字都应该被打印出来。我怎样才能做到这一点(任何示例代码都会有所帮助)以及应该从集合框架中使用哪个集合,或者我是否必须在 Java?
中使用纯数据结构
您必须制作自己的树结构,打印时,只需在父节点上调用 toString(),然后从该节点在子节点上调用 toString(),等等。
可能可能已经为该任务准备了一些结构,但另一方面:这个任务很容易自己完成——只需按顺序递归树:
- 从根节点开始
- 如果有左节点:输入并转到2。
- 否则:打印内容。
- 如果有正确的节点:输入并转到2。
- 其他:return
祝你好运。
一种可能的方法是创建您自己的树结构(带有子节点的节点)并将其包装到另一个跟踪节点 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]
我必须创建一个树结构,其中 parent 个节点有许多 children,每个 child 也可以有它们的 children。每个节点将由其唯一的 ID 和名称标识。
因此,当我从层次结构中输入任何 id 时,所有 node-ids 和他们的 child node-ids 以及他们的名字都应该被打印出来。我怎样才能做到这一点(任何示例代码都会有所帮助)以及应该从集合框架中使用哪个集合,或者我是否必须在 Java?
中使用纯数据结构您必须制作自己的树结构,打印时,只需在父节点上调用 toString(),然后从该节点在子节点上调用 toString(),等等。
可能可能已经为该任务准备了一些结构,但另一方面:这个任务很容易自己完成——只需按顺序递归树:
- 从根节点开始
- 如果有左节点:输入并转到2。
- 否则:打印内容。
- 如果有正确的节点:输入并转到2。
- 其他:return
祝你好运。
一种可能的方法是创建您自己的树结构(带有子节点的节点)并将其包装到另一个跟踪节点 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]