如何可视化打印一棵非二叉树?

3

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

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);

这对我来说很有意义,但我想要一种树形的可视化表示方式,以便我可以快速测试子节点和节点是否处于正确的位置。
我正在尝试让输出看起来像这样:enter image description here 或类似的东西。

当你说打印时,是指在命令行中吗?如果是的话,也许你应该尝试像目录树一样打印它。 - Linus
“或类似的东西” - 您是指它必须是图形表示吗?还是像文件浏览器中找到的缩进表示法可以接受? - laune
我正在寻找命令行输出,以便查看节点是否处于正确的位置。@Linus,是的,我相信我这里的内容类似于目录树,我会进一步研究它。 - Ryan Smith
2个回答

6

一种快速且简单的打印树的方法是在Tree类中添加以下方法:

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);
    }
}

level 表示树中节点的级别,定义为 1 +(节点与根之间的连接数)。它决定了节点在输出中的缩进程度。

然后,您可以通过打印根(根的级别为1)来打印树:

a.print(1);

获取这样的输出:
root
    n1
    n2
    n3
        n4
            n5

1
这个答案非常有帮助。不过,我会将“缩进”改为“级别”,因为树中的级别才是制表符的真正含义。 - randombee
@randombee 很好的观点,谢谢。我已经相应地更改了数字,因为根据定义根节点的级别为1。 - Cinnam

0

这个方法在Python中运行,是递归的。基本上,它打印每个节点的名称,增加缩进,然后调用每个节点的子节点函数。您需要在for循环之前添加一个if语句来确定是否到达了分支的末尾,以便不会再次调用该函数。

将其添加到您的树类中。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接