二叉树可以用常见的三种遍历结果来描述其构造,但是 不够直观,尤其是二叉树中有重复值的时候,仅通过三种遍历的结果来构造二叉树的真实结构是难上加难
那么我们如何设计一个更直观的二叉树描述呢?首先我们来看下面图中这个二叉树结构,我们来设计一个算法用来更直观的描述树的结构

以上面的这个树结构为例子,我们来给他的每个节点加点标识
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”, 输出的结果如下

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