二叉树递归遍历

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; }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值