二叉樹可以用常見的三種遍歷結果來描述其構造,但是 不夠直觀,尤其是二叉樹中有重復值的時候,僅通過三種遍歷的結果來構造二叉樹的真實結構是難上加難
那么我們如何設計一個更直觀的二叉樹描述呢?首先我們來看下面圖中這個二叉樹結構,我們來設計一個算法用來更直觀的描述樹的結構

以上面的這個樹結構為例子,我們來給他的每個節點加點標識
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”, 輸出的結果如下

當然大家還可以通過自己的方式去擴展