class Program
{
private const int Depth = 3;
private static int index;
private static readonly char[] Characters = new char[26];
private static readonly Random rd = new Random();
static void Main()
{
try
{
// 初始化数据源
int depth = 0;
index = 0;
SetCharacters(Characters);
var root = new Node { Data = CreateNodeData(depth, Direction.Root) };
// 创建节点
CreateNode(root, depth);
Console.WriteLine("\n先根遍历\n");
PreTranverse(root);
Console.WriteLine("\n\n中根遍历\n");
MiddleTranverse(root);
Console.WriteLine("\n\n后根遍历\n");
AfterTranverse(root);
}
catch (Exception e)
{
Console.WriteLine("\n\n" + e.Message);
}
finally
{
Console.WriteLine("\n\nFinished, any key to continue...");
Console.ReadKey();
}
}
/// <summary>
/// 先根遍历
/// </summary>
/// <param name="myNode"></param>
static void PreTranverse(Node myNode)
{
if (!string.IsNullOrEmpty(myNode.Data)) PrintNode(myNode.Data);
if (myNode.LeftNode != null) PreTranverse(myNode.LeftNode);
if (myNode.RightNode != null) PreTranverse(myNode.RightNode);
}
/// <summary>
/// 中根遍历
/// </summary>
/// <param name="myNode"></param>
static void MiddleTranverse(Node myNode)
{
if (myNode.LeftNode != null) MiddleTranverse(myNode.LeftNode);
PrintNode(myNode.Data);
if (myNode.RightNode != null) MiddleTranverse(myNode.RightNode);
}
/// <summary>
/// 后根遍历
/// </summary>
/// <param name="myNode"></param>
static void AfterTranverse(Node myNode)
{
if (myNode.LeftNode != null) AfterTranverse(myNode.LeftNode);
if (myNode.RightNode != null) AfterTranverse(myNode.RightNode);
if (!string.IsNullOrEmpty(myNode.Data)) PrintNode(myNode.Data);
}
/// <summary>
/// 创建节点
/// </summary>
/// <param name="myNode"></param>
/// <param name="depth"></param>
static void CreateNode(Node myNode, int depth)
{
// 节点深度记录
var index = depth + 1;
if (index >= Depth) return;
// 创建左节点
var leftNode = new Node { Data = CreateNodeData(index, Direction.Left) };
myNode.LeftNode = leftNode;
CreateNode(leftNode, index);
// 创建右节点
var rigthNode = new Node { Data = CreateNodeData(index, Direction.Right) };
myNode.RightNode = rigthNode;
CreateNode(rigthNode, index);
}
/// <summary>
/// 设置字符数据源
/// </summary>
/// <param name="characters"></param>
static void SetCharacters(char[] characters)
{
for (int i = 'A', j = 0; i <= 'Z'; i++, j++)
{
characters[j] = (char)i;
}
}
/// <summary>
/// 创建节点上的数据
/// </summary>
/// <param name="depth"></param>
/// <param name="direction"></param>
/// <returns></returns>
static string CreateNodeData(int depth, string direction)
{
//return string.Format("{0}-{1}{2}", depth, direction, rd.Next(10, 100));
//return string.Format("{0}-{1}", depth, direction);
var result = string.Format("{0}", Characters[index]);
index++;
return result;
}
static void PrintNode(string tips)
{
Console.Write(tips + " ");
}
}
/// <summary>
/// 遍历顺序
/// </summary>
public class Direction
{
public const string Left = "左";
public const string Right = "右";
public const string Root = "根";
}
/// <summary>
/// 节点
/// </summary>
class Node
{
public string Data { get; set; }
public Node LeftNode { get; set; }
public Node RightNode { get; set; }
}