二叉树可以用常见的三种遍历结果来描述其构造,但是 不够直观,尤其是二叉树中有重复值的时候,仅通过三种遍历的结果来构造二叉树的真实结构是难上加难
那么我们如何设计一个更直观的二叉树描述呢?首先我们来看下面图中这个二叉树结构,我们来设计一个算法用来更直观的描述树的结构
以上面的这个树结构为例子,我们来给他的每个节点加点标识
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”, 输出的结果如下
当然大家还可以通过自己的方式去扩展