实验一:熟悉C#语法和VS编程环境
实验目的
用C#构造一棵二叉树,并从根开始,按层的顺序,从右到左,从上到下,依次进行访问。
环境
- 操作系统: Windows 10 X64
- 工具: visual studio 2017
- 语言:C#
二叉树的结点存储结构
class tree
{
public string data;
public tree lchild;
public tree rchild;
}
先序构造二叉树
思路:
按先序次序输入二叉树中的结点的值(一行字符),”#“表示空树。
采用递归方式。
代码:
class list
{
public tree root;
public bool CreateBiTree(tree rt)//构造二叉树
{
string st;
st = Console.ReadLine();
if (st == "#")
{
// rt = null;
return false;
}
else
{
if (root==null)
{
rt = new tree();//分配一个实例对象的空间,将空间的地址赋给该变量
root = rt;
}
rt.data = st;
rt.lchild = new tree();
if (!CreateBiTree(rt.lchild))
rt.lchild = null;
rt.rchild = new tree();
if (!CreateBiTree(rt.rchild))
rt.rchild = null;
}
return true;
}
}
层级遍历
思路 :
1.创建一个队列(利用队列先进后出的性质),并将根结点加入队列中。
2.当队列头元素的左孩子不为空时,把左结点加入队列中;当队列头元素的右孩子不为空时,把右结点加入队列中。
3.移除头元素。
4.重复操作直至队列为空。
代码:
public bool LevelOrderTraverse()//按层遍历
{
MyDeClass myDe = new MyDeClass();
mydelegate p = new mydelegate(myDe.Print);//委托
Queue<tree> q = new Queue<tree>();
if(root==null)
{
Console.WriteLine("false");
return false;
}
q.Enqueue(root);
while (q.Count>0)
{
tree temp = q.Dequeue();
if (temp.rchild != null)
{
q.Enqueue(temp.rchild);
}
if (temp.lchild != null)
{
q.Enqueue(temp.lchild);
}
p(temp);
}
return true;
}
运行测试
输入 :
输出:
重点知识
1.委托
在层级遍历中用到了委托,类似于c,c++的函数指针。关于委托的知识可以参考
菜鸟教程——委托。
2.队列
在层级遍历中还用到了C#的Queue类。关于Queue类的内容可以参考 菜鸟教程——C#队列