基础向:如何输出一棵漂漂亮亮的树
在搞编译原理实验的时候,最后要求输出一棵漂漂亮亮的语法树,便突然想起了二叉树输出这个在初学编程时困扰过我的问题,索性就在这里把它解决了吧。
ps:对于只是想明白怎么输出树的同学,博客中编译原理相关的知识可以自行跳过。
先来看看最终效果
应该能满足大部分人的要求…?符号是用string定义的,如果有长度不为1的情况也可以支持
首先来看看treeNode的定义
我们的输出结构大概是这样,整棵树会被划分成若干行(包含深度相同的一行节点),有一个输出数组layer记录该行所有节点的输出信息,然后通过bfs(宽度优先搜索),每次将某一行的节点都取出填入输出数组后,将该输出数组输出。
对于每一行,实际是由三个物理行组成,第一行是在符号上面的‘|’标志,第二行是符号本身,第三行是连续的几段“----”。我们发现第一行和第二行所需的信息是该节点应该在哪个位置输出,第三行所需的信息是一段足以覆盖该节点儿子们的位置信息,也就是可以从第一个儿子覆盖到最后一个儿子就行(可以看例子,C下面有三个‘-’,覆盖了c和C)。所以终归来看实际所需的就是每个节点的位置信息即可,我选择的分配位置的方式就是从左至右依次分配。
另外,节点也需要保存深度信息,用于最后输出的时候表明谁和谁一行。
为了得到位置和深度信息,需要做两次dfs(深度优先搜索)
第一次搜索处理深度和size信息(表示该节点需要占用多宽空间,父节点一定是大于等于子节点的)
bfs输出
其中的printLine函数:
这样看来过去自己想的很繁琐的树输出问题其实还是有据可循,我的结果虽然可能不够漂亮,但它是一棵符合定义的象形的树了。