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


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

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

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

 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”, 输出的结果如下

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM