构造如下图所示的二叉树:
前序遍历
前序遍历遵循的是中——>左——>右的遍历顺序。以上图为例,其过程如下:
(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