C#实现泛型二叉树

构造如下图所示的二叉树:
在这里插入图片描述

前序遍历

前序遍历遵循的是中——>左——>右的遍历顺序。以上图为例,其过程如下:
(1)输出A,获取其左子节点B;
(2)输出B,获取其左子节点D;
(3)输出D,D的左右子节点均为空,此时B的左子树全部遍历完成,获取其右子节点E;
(4)输出E,E的左右子节点均为空,此时B的左右子树全部遍历完成,A的左子树全部遍历完成,获取其右子节点C;
(5)输出C,C的左子节点为空,获取其右子节点F;
(6)输出F,此时遍历全部完成。

中序遍历

中序遍历遵循的是左——>中——>右的遍历顺序。以上图为例,其过程如下:
(1)A->B->D,D的左右子节点均为空,输出D,获取其根节点B;
(2)输出B,获取其右子节点E;
(3)E的左右子节点均为空,输出E,此时A的左子树全部遍历完成,获取根节点A;
(4)输出A,获取其右子节点C;
(5)C的左子节点为空,输出C,获取其右子节点F;
(6)输出F,此时遍历全部完成。

后序遍历

后序遍历遵循的是左——>右——>中的遍历顺序。以上图为例,其过程如下:
(1)A->B->D,D的左右子节点均为空,输出D,获取其兄弟节点E;
(2)输出E,E的左右子节点均为空,获取其根节点B;
(3)输出B,此时A的左子树全部遍历完成,获取其右子节点C,C的左子节点为空,获取其右子节点F;
(4)输出F,此时C的左右子树全部遍历完成,获取C;
(5)输出C,此时A的左右子树全部遍历完成,获取A;
(6)输出A,此时遍历全部完成。

程序代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 第三层节点
            BinaryTree<string> d = new BinaryTree<string>() { Value = "D", Left = null, Right = null };
            BinaryTree<string> e = new BinaryTree<string>() { Value = "E", Left = null, Right = null };
            BinaryTree<string> f = new BinaryTree<string>() { Value = "F", Left = null, Right = null };

            // 第二层节点
            BinaryTree<string> b = new BinaryTree<string>() { Value = "B", Left = d, Right = e };
            BinaryTree<string> c = new BinaryTree<string>() { Value = "C", Left = null, Right = f };

            // 第一层节点
            BinaryTree<string> a = new BinaryTree<string>() { Value = "A", Left = b, Right = c };

            // 前序遍历
            Console.WriteLine("—————————————前序遍历———————————————");
            PreorderTraversal(a);

            // 中序遍历
            Console.WriteLine("—————————————中序遍历———————————————");
            SequentialTraversal(a);

            // 后序遍历
            Console.WriteLine("—————————————后序遍历———————————————");
            PostOrderTraversal(a);

            Console.ReadKey();
        }

        /// <summary>
        /// 前序遍历
        /// </summary>
        /// <param name="tree"></param>
        static void PreorderTraversal(BinaryTree<string> tree)
        {
            if (tree == null)
            {
                return;
            }
            Console.WriteLine(tree.Value);
            PreorderTraversal(tree.Left);
            PreorderTraversal(tree.Right);
        }

        /// <summary>
        /// 中序遍历
        /// </summary>
        /// <param name="tree"></param>
        static void SequentialTraversal(BinaryTree<string> tree)
        {
            if (tree == null)
            {
                return;
            }
            SequentialTraversal(tree.Left);
            Console.WriteLine(tree.Value);
            SequentialTraversal(tree.Right);
        }

        /// <summary>
        /// 后序遍历
        /// </summary>
        /// <param name="tree"></param>
        static void PostOrderTraversal(BinaryTree<string> tree)
        {
            if (tree == null)
            {
                return;
            }
            PostOrderTraversal(tree.Left);
            PostOrderTraversal(tree.Right);
            Console.WriteLine(tree.Value);
        }
    }

    public class BinaryTree<T>
    {
        /// <summary>
        /// 节点值
        /// </summary>
        public T Value { get; set; }

        /// <summary>
        /// 左子节点
        /// </summary>
        public BinaryTree<T> Left { get; set; }

        /// <summary>
        /// 右子节点
        /// </summary>
        public BinaryTree<T> Right { get; set; }
    }
}

程序运行结果如下:

—————————————前序遍历———————————————
A
B
D
E
C
F
—————————————中序遍历———————————————
D
B
E
A
C
F
—————————————后序遍历———————————————
D
E
B
F
C
A

发布了99 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/HerryDong/article/details/104662438