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

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

image.png
image.png

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

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

代码如下

  1. public class PrintBinaryTree {
  2. static class Node{
  3. public int value;
  4. public Node left;
  5. public Node right;
  6. public Node(int value) {
  7. this.value = value;
  8. }
  9. }
  10. /**
  11. * @param head 传入的节点
  12. * @param height  层数(根节点为0)
  13. * @param to 表示的特定节点 H表示根节点 ^表示父亲节点在左上方 v表示父亲节点在左下方
  14. * @param len    指定每一个节点打印的宽度(总宽度)
  15. */
  16. static void printTree(Node head,int height,String to,int len){
  17. if(head == null)
  18. return;
  19. printTree(head.right,height + 1,"v",len); // 递归右子树
  20. String val = to + head.value + to; // 加上两边指示的字符
  21. int lenV = val.length();
  22. int lenL = (len - lenV)/2; // 左边的空格 ((总长度-值所占长度),然后分一半)
  23. int lenR = len - lenV - lenL; // 右边的空格 (总-值-左边空格长度)
  24. System.out.println( getSpace(len * height) + getSpace(lenL) + val + getSpace(lenR)); // len*length是对应的层数对应的空格
  25. printTree(head.left,height + 1,"^",len); // 递归左子树
  26. }
  27. //获取指定的空格
  28. static String getSpace(int len){
  29. StringBuffer str = new StringBuffer();
  30. for(int i = 0; i < len; i++)
  31. str.append(" ");
  32. return str.toString();
  33. }
  34. public static void main(String[] args) {
  35. /**
  36. * 1
  37. * 2 3
  38. * 4 5 6
  39. * 7
  40. */
  41. Node head = new Node(1);
  42. head.left = new Node(2);
  43. head.right = new Node(3);
  44. head.left.left = new Node(4);
  45. head.right.left = new Node(5);
  46. head.right.right = new Node(6);
  47. head.left.left.right = new Node(7);
  48. printTree(head,0,"H",10);
  49. }
  50. }