二叉树存储与遍历实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树的存储与遍历
实验题目:二叉树的存储与递归遍历。
实验目的:掌握二叉树的定义、存储及遍历的算法及上机的基本操作。实验内容与步骤:
(1)树结构的基本操作,即操作者使用先序遍历的原理创建一个由多个节点组成的二叉树结构,并使用递归算法按先序、中序、
后序对二叉树进行遍历。
(2)程序及部分注释如下:
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAX(a,b) (a>b?a:b)
typedef char TElemType;
typedef int Status;
//二叉树的二叉链表存储结构
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍历生成二叉树
Status CreatBiTree(BiTree &T)
{
TElemType ch,temp;
printf("输入一个元素: ");
scanf("%c",&ch);
temp=getchar(); //结束回车
if(ch==' ') T=NULL; //输入空格表示结点为空树
else
{
if(!(T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch; //生成根结点
CreatBiTree(T->lchild); //构造左子树
CreatBiTree(T->rchild); //构造右子树
}
return OK;
}
//打印元素
Status PrintElem(TElemType e)
{
printf("%c ",e);
return OK;
}
//先序遍历二叉树
Status PreOrderTraverse(BiTree T,Status (* Visit)(TElemType e)) {
if(T){ //二叉树不为空时
if(Visit(T->data)) //访问根结点
if(PreOrderTraverse(T->lchild,Visit)) //先序遍历左子树
if(PreOrderTraverse(T->rchild,Visit)) return OK; //先序遍历右子树
return ERROR;}
else return OK;
}
//中序遍历二叉树
Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)) {
if(T){
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit)) return OK;
else return ERROR;}
return OK;
}
//后序遍历二叉树
Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){ if(T){
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data)) return OK;
else return ERROR;
}
return OK;
}
void main()
{
BiTree T;
Status (* Visit)(TElemType);
Visit=PrintElem;
CreatBiTree(T);
printf("\n先序遍历:");
PreOrderTraverse(T,Visit);
printf("\n中序遍历:");
InOrderTraverse(T,Visit);
printf("\n后序遍历:");
PostOrderTraverse(T,Visit);
printf("\n程序结束.\n");
}
分析与体会:
(1)本程序采用的是递归的算法实现了二叉树的三种遍历,相对于非递归的算法较为简单。但是也有一些缺点,例如数据录入的过程,是建立在用户首先熟练掌握先序遍历的原理的基础上。
在此我拿书上的一个例子来说明,如下图2-16:
在应用程序之前我首先简单说明一下先序遍历的原理(在录入数据时用到):先访问根节点,然后左子数,最后右子数。当程序开始运行
时,会提示用户每次输入一个数据并以回车结束,以上图为例,录入数据依次为:‘1’,‘2’,‘4’,‘’,‘’,‘5’,‘6’,‘’,‘’,‘7’‘’,‘’,‘3’,‘’,‘’(注意:无数据时输入空格)程序执行后打印出:
先序遍历:1,2,4,5,6,7,3
中序遍历:4,2,6,5,7,1,3
后序遍历:4,6,7,5,2,3,1
程序结束
上述实验结果与书上的结果完全吻合,由此验证了实验的可行性。(2)通过本实验我对二叉树的存储与遍历有了更深刻的理解,尤其是对复杂的递归思想也有了一定的了解。在整个实验过程中我认为程序运行时数据的录入过程是个难题,这给予我一定的警示:开发应用程序时应该站在用户的角度看待问题,设计产品必须人性化等等。经过了本次实验我觉得自己收获了不少宝贵的经验!
验指导教师(签名):实验成绩: