分享一个横向打印二叉树图形的方法

最近想起之前大二学数据结构时测试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) {
   
        
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值