zoukankan      html  css  js  c++  java
  • 如何较为直观的打印二叉树

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

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

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

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

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

  • 相关阅读:
    zabbix邮件报警
    简单的带权随机算法
    一、向量
    C#遍历DataSet
    旅游(二)——广州
    旅游(一)——潮州
    LoRa术语
    Linux基础(一)
    Git(二)_基本命令
    Git使用(一)——Cygwin
  • 原文地址:https://www.cnblogs.com/BigDong/p/8017680.html
Copyright © 2011-2022 走看看