一、前言
本篇目的
- 构建一个自定义泛型树Tree
- 定义该类的枚举器,实现先序遍历
- 用get访问器,实现树的中序,后序,层序遍历
开发环境
- 操作系统: Windows 10 X64
- SDK:NET Framework 4.7.2
- IDE:Visual Studio 2019
二、部分名词解释
泛型
泛型,是指通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
泛型类型和普通类型的区别在于泛型类型与一组类型参数或类型变量关联。
通常先声明泛型,然后通过类型实例化来使用泛型。定义泛型的语法格式如下:
[访问修饰符][返回类型] 泛型名称<类型参数列表>
其中,“泛型名称”要符合标识符的定义。尖括号表示类型参数列表,可以包含一个或多个类型参数,如<T,U,>。
树
树(Tree)是n(n≥0)个结点的有限集。
它或为空树(n = 0),或为非空树。
对于非空树T:(1)有且仅有一个称之为根的结点;
(2)除根结点以外的其余结点可分为m(m>0)个互不相交的有限集T1, T2, …, Tm, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
二叉树为m=2,即除根结点以外的其余结点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身又都是二叉树。
二叉树的结构最简单,规律性最强;
可以证明,所有树都能转为唯一对应的二叉树,不失一般性。
二叉树遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
⑴访问结点本身(N),
⑵遍历该结点的左子树(L),
⑶遍历该结点的右子树(R)。
以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。
①先序遍历
NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。