问题
假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母。 要求实 现二叉树的横向显示问题,如下图所示打印结果。

问题分析
(1) 二叉树的横向显示应是二叉树竖向显示的90°旋转。分析上图可知,这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,按由上而下顺序看,其输出的结点序列为:CFEADB,这恰为逆中序遍历。所以横向显示二叉树的算法为先右子树、再跟结点、再左子树的RDL结构。
(2)在这种输出格式中,结点的左右位置与结点的深度有关,故算法中设置了一个表实当前跟结点层深的参数,以控制输出结点的左、右位置,每当递归进层时层深参数加1。
算法描述
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tree
{
class TreeNode<T>
{
T data;
TreeNode<T> LChrild;
TreeNode<T> RChirld;
public T Data { get => data; set => data = value; }
internal TreeNode<T> LChrild1 { get => LChrild; set => LChrild = value; }
internal TreeNode<T> RChirld1 { get => RChirld; set => RChirld = value; }
public TreeNode(T data)
{
this.Data = data;
}
public TreeNode()
{
this.Data = default(T);
this.LChrild1 = null;
this.RChirld1 = null;
}
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tree
{
class Program
{
static int total = 0; //叶子结点数目
static void Main(string[] args)
{
TreeNode<string> A = new TreeNode<string>("a");
TreeNode<string> B = new TreeNode<string>("b");
TreeNode<string> C = new TreeNode<string>("c");
TreeNode<string> D = new TreeNode<string>("d");
TreeNode<string> E = new TreeNode<string>("e");
TreeNode<string> F = new TreeNode<string>("f");
TreeNode<string> G = new TreeNode<string>("g");
TreeNode<string> H = new TreeNode<string>("h");
A.LChrild1 = B;
B.RChirld1 = D;
A.RChirld1 = C;
D.LChrild1 = F;
D.RChirld1 = G;
C.RChirld1 = E;
E.RChirld1 = H;
PrintTree(A, 0);
}
/// <summary>
/// 逆中序(RDL)遍历实现横向(从屏幕左到屏幕右)梳妆打印
/// </summary>
/// <param name="node"></param>
/// <param name="space"></param>
static void PrintTree(TreeNode<string> node,int space)
{
if (node == null)
return;
PrintTree(node.RChirld1, space + 1);
for (int i = 0; i < space; i++)
{
Console.Write(" ");
}
Console.WriteLine(node.Data);
PrintTree(node.LChrild1, space+1);
}
}
}
网友评论