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

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

在这里插入图片描述

这里写图片描述

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

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

代码如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 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); } }