在Java中显示树的层次结构及其值

时间:2015-05-28 09:37:05

标签: java data-structures collections

我必须创建一个树结构,父节点有许多子节点,每个子节点也可以有自己的子节点。每个节点将由其唯一的ID和名称标识。

因此,当我从层次结构中输入任何id时,应打印所有node-id及其子节点ID及其名称。我如何实现这一点(任何示例代码都有帮助)以及应该从集合框架中使用哪个集合,还是必须在Java中使用纯数据结构?

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

您必须创建自己的树结构,并且在打印时,只需在父节点上调用toString(),然后从该节点调用子节点上的toString()等。

答案 2 :(得分:0)

可能是为某项任务做好准备的结构,但另一方面:这项任务非常简单 - 只需按顺序在树上执行递归:

  1. 从根节点开始
  2. 如果有左节点:输入它并转到2.
  3. 其他:打印内容。
  4. 如果有正确的节点:输入它并转到2.
  5. 否则:返回
  6. 祝你好运。