我本对分享毫无兴趣,也从未有过编写教程的想法。

然而这个学期的C#课程的教授要求我以教程的形式撰写实验报告。不出所料,写完后总有许多同学欲向我借去"借鉴"。那么多人,一个个发属实有些繁琐,索性丢到 自己的个人站上让大家自由借阅。

于是就有了这一系列笔记。随便写写,从心所欲,谨慎阅读。

C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。

C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。

C# 是专为公共语言基础结构(CLI)设计的。CLI 由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。

配置开发环境

在C#的学习过程中,我们一般使用Visual Studio或者VS Code来编写,前者体积较大,但功能较为完善,配置也较容易;后者虽然轻量,但配置环境对于初学者来说较为困难。所以笔者在此使用了Visual Studio来进行编写。

下载VS

首先前往VS官网进行下载。

然后下载完安装包后进行安装,一路点NEXT就好了。

新建项目

由于这次只是编写一个简单的二叉树,所以我们只要创建控制台应用就足够了。

接着进入下一步,输入程序名称,选择存放目录,之后点击“创建”,就可以开始编写我们的第一个程序了。

第一个程序

作为刚刚接触C#的我们,自然要从一个较为简单的程序开始入手。这里笔者选择抽到了实验2.4:

2.4 用C#构造一棵二叉树,并从根开始,按层的顺序,从右到左,从上到下,依次进行访问。

既然如此,我们就先来了解一下二叉树是什么。

二叉树

二叉树,顾名思义就是一颗拥有二叉的树。从根节点开始,每个节点都分为左右两个子节点,在每个节点处可以存储数据。当然,子节点并不是必需的,可以仅拥有一个子节点,甚至可以没有子节点。

层序遍历

层序遍历,顾名思义:就是按层的顺序进行遍历,从上到下按每层的顺序分别从左到右遍历。例如图中的这棵树,层序遍历的结果就是:

F -> C -> E -> A -> D -> H -> G -> B -> M

很显然,我们要实现的算法与层序遍历类似。

算法实现

创建一棵树

1
2
3
4
5
6
public class Tree
{
public string value = "";
public Tree left = null;
public Tree right = null;
}

这就是一个最基础的节点,很简单,就三行代码。第一行储存节点的数据,第二三行分别储存了另外两个节点,默认都为null。

给这棵树赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static void CreateTree(Tree tree)
{
tree.value = "root";
tree.left = new Tree
{
value = "left1",
left = new Tree
{
value = "left2",
},
...
};
...
}

赋完值后的这棵树长这样:

此时,我们就可以对它进行遍历输出了。

队列

在进行遍历算法之前,我们要先了解一下队列:

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队

层序遍历需要依靠队列来实现。

遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void RevLevelOrder(Tree tree)
{
var queue = new System.Collections.Generic.Queue<Tree>();
queue.Enqueue(tree); //根节点入队
while (queue.Count!=0)
{
var item = queue.Dequeue(); //出队
Console.Write(item.value + " ");
if (item.right != null)
{
queue.Enqueue(item.right); //下一层的右节点入队
}
if (item.left != null)
{
queue.Enqueue(item.left); //下一层的左节点入队
}
}
}

遍历算法的实现应该不难理解,主要利用了队列先进先出的特性,每层按从右到左的顺序依次入队,先入队的右节点先出队,出队后再将其子节点按同样的顺序入队,这样等该层处理完,就能按安排好的顺序处理下一行的节点数据。直到队列为空。

代码的输出结果如下:

root right1 left1 right2 left3 left2 right5 right3 left4 right4

显然,符合我们的预期结果,说明算法被正确地实现了。

对于第一次接触C#的我们,二叉树的层序遍历算是较为简单的算法,适合作为第一次上手的练手程序。当然,这次实验用到的都只是C#的基础语法,并未涉及到其深层特性。C#是一门十分优秀的语言,值得后续不断地深入。