Java 按照树形结构打印 N 叉树

在我们完成一棵树的构建之后,如果我们想要看这棵树的结构,不像数组或者 List 等数据结构,我们可以非常方便地用各种方式将其中的所有元素打印出来,对于树而言,这个过程要麻烦得多,我们可以用各种遍历方式得到这棵树的结构,但是终究还是不够直观。

如果我们可以按照树的结构,将其打印出来就好了,那么本文就是一种实现这个目标的思路以供参考。

N 叉树的结构

本文中所用的树的结构是 LeetCode 上所用的树的结构,其定义如下:

public class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};

简单打印

{值,子数组} 的方式进行打印。

实现方式

复写 Node 类的 toString () 方法:

@Override
public String toString() {
    return "{" + val + (children==null?"":", " + children) + '}';
}

打印效果

对于 N 叉树:

image-20210319111845206

打印效果如下

{1, [{3, [{5}, {6}]}, {2}, {4}]}

对于 N 叉树:

image-20210319112127643

打印效果如下:

{1, [{2}, {3, [{6}, {7, [{11, [{14}]}]}]}, {4, [{8, [{12}]}]}, {5, [{9, [{13}]}, {10}]}]}

目录层级打印

模拟目录层级的方式进行打印。

实现方式

public static void print(Node root) {
    printHelper(root, "\t");
}

private static void printHelper(Node root, String start) {
    if (root == null) {
        return;
    }
    String mid = start.substring(0, start.lastIndexOf("\t")) + "└---";
    System.out.println(mid + root.val);
    if (root.children == null) {
        return;
    }
    for (Node node : root.children) {
        printHelper(node, start + "\t");
    }
}

打印效果

对于 N 叉树:

image-20210319111845206

打印效果如下

└---1
	└---3
		└---5
		└---6
	└---2
	└---4

对于 N 叉树:

image-20210319112127643

打印效果如下:

└---1
	└---2
	└---3
		└---6
		└---7
			└---11
				└---14
	└---4
		└---8
			└---12
	└---5
		└---9
			└---13
		└---10