最近想起之前大二学数据结构时测试B树时写了一个打印二叉树的C语言函数,现在突然想把它记录一下,改成打印二叉树的Java实现
效果
上图的二叉树打印效果如下
解释一下这个图,将图顺时针旋转90°,看见有两种箭头
- 短箭头表示这是一个值,即该节点的值
- 长箭头指向该节点的子树,长箭头在值的左边,则指向左子树,在值的右边则指向右子树
算法分析
这个算法按行打印,每一个节点,子树和值在同一个“平台”上(“平台”只他们在的一条线上),先打印右子树(有的话),再打印值,再打印左子树(有的话),打印子树时,又是按照这样的策略(先右再值再左),麻烦在于打印完一个节点的一个部分后,打印下一个部分在下一行,在打印的过程中,可能需要打印祖先节点的“平台”,也可能不用,用不用由这个条件判断:该节点在该祖先节点的子树是否是该祖先节点最后一个需要打印的子树,在二叉树里,就是指左子树。
- 如节点3在节点2的右子树上,右子树不是节点2最后需要打印的子树,所以需要打印节点3时(包括子树和值),需要打印节点2的平台
- 如节点0在节点2和节点1的左子树上,左子树是最后一个需要打印的子树,那么就不打印它们的平台
那么在打印某一个节点,都需要在新的一行开始,那么怎么知道某个祖先节点的平台是否需要打印呢:用一个List存起来,里面的值为从根节点开始,每一个祖先节点是否需要打印平台(打印的子树是否是最后打印的子树),需要在遍历的过程中,由每个祖先节点放入。
代码实现
//树的定义
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;