如何直观的打印一颗二叉树

发布于 2024-06-18 18:54:55 字数 2410 浏览 13 评论 0

打印的结果是需要顺时针旋转 90 度的,如下面的结果打印出来是这样的。

如何打印呢? 需要处理以下四个问题:

  • 遍历树的顺序是 右子树->根->左子树;
  • 因为要避免数字长度影响对齐的因素,所以两边补上空格(有一个总长度可以自己确定);
  • 在结点的两边加上特定的字符串标记区分孩子和父亲以及位置,使用 H^v 这个几个标记
  • 和高度有关系的 height * len , 打印相应前面的空格长度;

代码如下

public class PrintBinaryTree {

    static class Node{
        public int value;
        public Node left;
        public Node right;

        public Node(int value) {
            this.value = value;
        }
    }

    /**
     * @param head      传入的节点
     * @param height  层数(根节点为 0)
     * @param to       表示的特定节点  H 表示根节点   ^表示父亲节点在左上方 v 表示父亲节点在左下方
     * @param len    指定每一个节点打印的宽度(总宽度)
     */
    static void printTree(Node head,int height,String to,int len){
        if(head == null)
            return;
        printTree(head.right,height + 1,"v",len);  // 递归右子树

        String val = to + head.value + to;   // 加上两边指示的字符
        int lenV = val.length();
        int lenL = (len - lenV)/2;    //  左边的空格  ((总长度-值所占长度),然后分一半)
        int lenR = len - lenV - lenL; //  右边的空格  (总-值-左边空格长度)
        System.out.println( getSpace(len * height) + getSpace(lenL) + val + getSpace(lenR)); // len*length 是对应的层数对应的空格

        printTree(head.left,height + 1,"^",len);  // 递归左子树
    }

    //获取指定的空格
    static String getSpace(int len){
        StringBuffer str = new StringBuffer();
        for(int i = 0; i < len; i++)
            str.append(" ");
        return str.toString();
    }

    public static void main(String[] args) {
        /**
         *              1
         *            2   3
         *          4    5 6
         *            7
         */
        Node head = new Node(1);
        head.left = new Node(2);
        head.right = new Node(3);
        head.left.left = new Node(4);
        head.right.left = new Node(5);
        head.right.right = new Node(6);
        head.left.left.right = new Node(7);
        printTree(head,0,"H",10);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

尬尬

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文