Java 如何直观地打印非二叉树?

Java 如何直观地打印非二叉树?,java,tree,Java,Tree,我创建了一个基本树,其中所有节点都有一个名称和一组子节点 public class Tree { String data; Tree parent = null; HashSet children = new HashSet(); public Tree(String nodeName) { this.data = nodeName; } public void parent(Tree parent) { thi

我创建了一个基本树,其中所有节点都有一个名称和一组子节点

public class Tree {
    String data;
    Tree parent = null;
    HashSet children = new HashSet();

    public Tree(String nodeName) {
        this.data = nodeName;
    }

    public void parent(Tree parent) {
        this.parent = parent
    }

    public void addAChild(Tree child) {
        this.children.add(child);
        child.parent(this);
    }
使用这个类

Tree a = new Tree("root");
Tree b = new Tree("n1");
Tree c = new Tree("n2");
Tree d = new Tree("n3");
Tree e = new Tree("n4");
Tree f = new Tree("n5");

a.addAChild(b);
a.addAChild(c);
a.addAChild(d);

d.addAChild(e);
e.addAChild(f);
这对我来说是有意义的,但是我想要一个树的可视化表示,这样我就可以快速测试子节点和节点是否位于正确的位置

我试图使输出如下所示:

root
    n1
    n2
    n3
        n4
            n5

或者类似的东西

打印树的一种快速而肮脏的方法是在
类中添加如下方法:

public void print(int level) {
    for (int i = 1; i < level; i++) {
        System.out.print("\t");
    }
    System.out.println(data);
    for (Tree child : children) {
        child.print(level + 1);
    }
}
获得如下输出:

root
    n1
    n2
    n3
        n4
            n5

此方法在python中工作,并且是递归的。基本上,它打印每个节点的名称,增加缩进,然后在每个节点的每个子节点上调用函数。您必须在for循环之前添加if语句,以确定您是否位于分支的末尾,这样它就不会再次调用该函数

将其添加到树类中

 def display(self,indent=0):
    print( (' '*indent)+self.name)        
    for c in self.children:
      c.display(indent+1)

你说的打印是指在命令行中吗?如果是这样的话,也许你应该试着像目录树一样打印它。“或者类似的东西”-你是说它必须是一个图形表示吗?或者像您在文件浏览器中找到的缩进表示可以吗?我正在寻找命令行输出,以便查看节点是否处于正确位置。还有@Linus是的,我相信这里的内容类似于目录树,我会研究一下。这个答案非常有用。不过,我会将“缩进”改为“级别”,因为树中的级别才是选项卡的真正含义。这一点很好,谢谢。我也相应地修改了数字,因为root的级别定义为1。