二叉树的建立与遍历Word文件下载.docx
《二叉树的建立与遍历Word文件下载.docx》由会员分享,可在线阅读,更多相关《二叉树的建立与遍历Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
1.3实验要求
1)编写创建二叉树的函数,函数名命名为creat()。
2)编写递归实现二叉树的先序、中序和后序遍历算法。
函数名分别为:
preorder、inorder、postorder。
3)编写主函数测试以上二叉树的创建和遍历函数。
1.4编程环境
软件方面:
测试系统在Windows7下的MicrosoftVisualC++6.0环境中编写并测试。
编程语言:
c语言
编程人员:
1人完成。
1.5实验的意义
1)提高对数据逻辑结构的特点以及存储表示方式的认识,培养在具体应用中选择合适的数据结构和存储结构的能力。
2)熟悉软件开发的基本过程,初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等阶段基本任务和技能方法。
3)培养自己的算法设计和算法分析能力,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
4)综合运用二叉树的各种遍历算法,理论结合实际,将其运用到文章编辑这一实验中。
使这些知识得到进一步巩固、加深和拓展。
2数据结构设计
2.1模块说明
1)建树模块
二叉树的建立函数,其原理是对于一般的二叉树,添加虚结点’#’使其成为完全二叉树,然后按顺序横向输入结点信息,以‘!
’为结束标志,设置指针类型的数组来记录地址,使front指向队列里最前面的结点,rear指向输入的结点,其中front初始为0,rear初始为-1,增加counter计数,若输入的结点不是虚结点,则建立一个新结点,若是第一个,则令其为根结点,不断循环,直至遇到’!
’符号。
2)先序遍历算法模块
voidpreorder(TNODE*bt)
{
if(bt!
=NULL)
{
printf("
%c"
bt->
data);
preorder(bt->
lchild);
rchild);
}
}
3)中序遍历算法
voidinorder(TNODE*bt)
inorder(bt->
4)后序遍历算法
voidpostorder(TNODE*bt)
postorder(bt->
2.2实验流程图
2.3页面设计
1)
******************************************************************
**建立二叉树,请输入结点:
(以#表示虚节点,以!
表示结束)**
2)
************************************************************
**1递归先序遍历2递归中序遍历3递归后序遍历0退出************************************************************
3详细设计
3.1设计的相关知识
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
数据类型可分为两类:
原子类型、结构类型。
一方面,在程序设计语言中,每一个数据都属于某种数据类型。
类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。
可以认为,数据类型是在程序设计中已经实现了的数据结构。
另一方面,在程序设计过程中,当需要引入某种新的数据结构时,总是借助编程语言所提供的数据类型来描述数据的存储结构。
此次课程设计是关于二叉树的各种遍历算法,首先建立一个树,然后有程序来分别输出先序遍历,中序遍历和后序遍历。
3.2实验流程图
4测试
4.1实验验证结果
1)可执行性:
程序在刚写好的时候,里面未免会有一系列的错误,包括逻辑错误、语句错误及粗心引起的标点的错误等。
在测试中,通过多次的测试来找出其中的错误所在,并修改。
2)可用性:
本次设计的主要目标是实现二叉树的前序遍历、中序遍历和后序遍历。
在本块中,要通过运行程序进行一遍一遍的循环,判断,删除,通过调试、修改达到最后的目标。
4.2实验测试截图
1)界面测试
图4.2-1界面测试截图
2)实验操作测试
图4.2-2测试操作截图a
图4.2-2测试操作截图b
5设计总结
通过这次的课程设计,我认识到:
仅仅掌握课本上的知识是不够的,在实际操作时,常常遇到一些问题,自己看不懂,更无法解决。
不过,经过自己不断的思考,尝试着去更改代码中出现的问题。
虽然开始很困难,但在老师和同学的帮助下,我逐渐的熟悉了许多操作,为后继工作的顺利进行做了准备。
个人的力量是薄弱的,我学会了咨询别人,不再胆怯,不再保守。
在过程中和同学相互讨论,询问老师,不断进步。
也许,我们可以说,编一个程仅仅是开始,调试和运行相比之下更难。
实践中收获的远比想象的多。
在这个编程中,如果你在设计时存在逻辑错误,虽然源代码没错,不过在运行时就有问题,在调试中前后函数的功能要对应,要不然就不能正确运行,还有一些基本的符合不符合规范,注意英文字母的书写。
看到自己完成了所要求的任务,有一种无法用言语来形容的欣慰之感,这也是无法从学习书本知识中得到的。
课程设计的结束并不代表着学习的结束。
这次的设计,把我带入到了一个全新的不曾接触过的领域,让我在以往只是注重操作的基础上,更多的思考到了,这是如何实现的,运用我所学到的知识是不是可以同样做出这样的网站,实现不一样的操作,达到同样的效果?
我似乎有所领悟了,学习的本质不是让你牢牢的掌握一个知识,而是让你掌握一种方法,一种思想。
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2002
[2]许卓群.数据结构与算法.北京:
高等教育出版社,2004
[3]金远平.数据结构(C语言版).北京:
清华大学出版社,2005
[4]陈倩诒邓红卫.数据结构(C语言版)武汉:
华中科技大学出版社,2013
附页:
实验代码
#include<
stdio.h>
malloc.h>
structtnode//结点结构体//
chardata;
structtnode*lchild,*rchild;
};
typedefstructtnodeTNODE;
TNODE*creat(void)
TNODE*root,*p;
TNODE*queue[50];
intfront=0,rear=-1,counter=0;
//初始队列中需要的变量front、rear和计数器counter//
charch;
printf("
**************************************************************************\n"
);
表示结束)**\n"
ch=getchar();
while(ch!
='
!
'
)
if(ch!
#'
p=(TNODE*)malloc(sizeof(TNODE));
p->
data=ch;
lchild=NULL;
rchild=NULL;
rear++;
queue[rear]=p;
//把非#的元素入队//
if(rear==0)//如果是第一个元素,则作为根节点//
{
root=p;
counter++;
}
else
if(counter%2==1)//奇数时与其双亲的左子树连接//
{
queue[front]->
lchild=p;
}
if(counter%2==0)//偶数时与其双亲的左子树连接//
rchild=p;
front++;
counter++;
}
}
else//为#时,计数,但不连接结点//
{
if(counter%2==0)
front++;
counter++;
ch=getchar();
returnroot;
voidpreorder(TNODE*bt)//先序遍历//
voidinorder(TNODE*bt)//中序遍历//
voidpostorder(TNODE*bt)//后序遍历//
intmain()
TNODE*root;
intchioce,flag=1;
root=creat();
while(flag!
=0)
************************************************************\n"
**1递归先序遍历2递归中序遍历3递归后序遍历0退出**\n"
scanf("
%d"
&
chioce);
switch(chioce)
{
case1:
printf("
递归先序遍历是:
"
preorder(root);
\n"
break;
case2:
递归中序遍历是:
inorder(root);
case3:
递归后序遍历是:
postorder(root);
case0:
flag=0;
}
return0;