如何较为直观的打印二叉树

二叉树可以用常见的三种遍历结果来描述其构造,但是 不够直观,尤其是二叉树中有重复值的时候,仅通过三种遍历的结果来构造二叉树的真实结构是难上加难

那么我们如何设计一个更直观的二叉树描述呢?首先我们来看下面图中这个二叉树结构,我们来设计一个算法用来更直观的描述树的结构

以上面的这个树结构为例子,我们来给他的每个节点加点标识

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 
 8 public class Node
 9 {
10     public int value;
11     public Node left;
12     public Node right;
13 
14     public Node(int data)
15     {
16         this.value = data;
17     }
18 
19     /// <summary>
20     /// 加上字符的打印二叉树
21     /// </summary>
22     /// <param name="head">头结点</param>
23     public void PrintTree(Node head)
24     {
25         PrintInOrder(head, 0, "H", 17);
26     }
27 
28     /// <summary>
29     /// 打印树数据的核心
30     /// </summary>
31     /// <param name="head">头结点</param>
32     /// <param name="height">数高度</param>
33     /// <param name="to">字符表示 H代表头 V代表右结点,v代表左结点</param>
34     /// <param name="len"></param>
35     public void PrintInOrder(Node head, int height, string to, int len)
36      {
37         //保证结点空时退出递归
38         if (head == null) return;
39         //先递归遍历右结点,找到右结点就输出加上符号V和固定空格的字符
40         PrintInOrder(head.right, height + 1, "V", len);
41         //获得该结点对应的字符,VnumV,表示右结点
42         string val = to + head.value + to;
43         //计算需要补多少位的空格
44         int lenM = val.Length;
45         int lenL = (len - lenM) / 2;
46         int lenR = len - lenM - lenL;
47         val = GetSpace(lenL) + val + GetSpace(lenR);
48         //输出补位空格的字符
49         Console.Write(GetSpace(height * len) + val);
50         //递归遍历左结点,如果不为空则打印字符 ^num^
51         PrintInOrder(head.left, height + 1, "^", len);
52     }
53 
54     /// <summary>
55     /// 规定打印时这个字符占用的长度一致
56     /// 缺多少位就补上多少位的空格
57     /// </summary>
58     /// <param name="num"></param>
59     /// <returns></returns>
60     public string GetSpace(int num)
61     {
62         string space = "";
63         StringBuilder buf = new StringBuilder(" ");
64         for (int i = 0; i < num; i++)
65         {
66             buf.Append(space);
67         }
68         return buf.ToString();
69     }
70 }

通过原来描述的基础上,我们给右结点加上了"V",给左结点加上了“^”,给头结点加上了“H”, 输出的结果如下

当然大家还可以通过自己的方式去扩展

原文地址:https://www.cnblogs.com/BigDong/p/8017680.html