二叉树的遍历.docx
《二叉树的遍历.docx》由会员分享,可在线阅读,更多相关《二叉树的遍历.docx(17页珍藏版)》请在冰豆网上搜索。
二叉树的遍历
攀枝花学院本科学生课程设计任务书
题 目
二叉树的遍历及应用
1、课程设计的目的
1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)
[问题描述]建立二叉树,并输出二叉树的先序、中序和后序遍历序列,以及二叉树的叶子数。
[实现提示]可通过输入带空格的前序序列建立二叉链表
3、主要参考文献
[1]刘大有等,《数据结构》(C语言版),高等教育出版社
[2]严蔚敏等,《数据结构》(C语言版),清华大学出版社
[3]WilliamFord,WilliamTopp,《DataStructurewithC++》清华大学出版社
[4]苏仕华等,数据结构课程设计,机械工业出版社
4、课程设计工作进度计划
1)分析题目,查阅相关资料:
1天;
2)算法设计、数据结构设计:
1天
3)编写代码并调试:
1天
4)完成课程设计报告:
2天
指导教师(签字)
日期
年月日
教研室意见:
年月日
学生(签字):
接受任务时间:
年月日
注:
任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表
题目名称
评分项目
分值
得分
评价内涵
工作
表现
20%
01
学习态度
6
遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
5
能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。
06
设计(实验)能力,方案的设计能力
5
能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。
07
计算及计算机应用能力
5
具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。
08
对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图(或图纸)质量、篇幅、设计(论文)规范化程度
5
符合本专业相关规范或规定要求;规范化符合本文件第五条要求。
10
设计说明书(论文)质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名:
年 月 日
摘要
二叉树的遍历及应用属于数据结构这门课程的知识,在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者对二叉树中全部结点逐一进行某种处理。
这样就提出了一个遍历二叉树的问题,即如何按某条搜索路径寻访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。
对于二叉树而言,它是一种非线性结构,每个结点都可能有两棵子树,因而需要寻找一种规律,以便使二叉树上的结点能排列在一个线性队列上,从而便于遍历。
由二叉树的定义可知,二叉树是由3个部分组成:
根结点,左子树,右子树。
因此,若能依次遍历这三部分,便是遍历了整个二叉树。
若限定先左后右,则只有前三种情况,分别称之为先序遍历,中序遍历,后序遍历,而这三种遍历方法是基于二叉树递归的定义。
关键词:
二叉树,遍历,数据结构,线性,递归
Ⅰ
摘要………………………………………………………………………………Ⅰ
目录………………………………………………………………………………Ⅱ
6.1调试运行程序……………………………………………………………………………..10
6.2运行结果的说明……………………………………………………………………………11
Ⅱ
1课程设计目的
旨在培养我们对学到的课本知识实际解决问题的能力和我们的动手能力,同时加强我们所学知识,是我们掌握得更牢固。
在此次二叉树的建立和遍历应用的实验中,主要目的是:
熟练掌握树的基本概念、二叉树的基本操作及在链式存储结构上的实现;掌握二叉树的生成、遍历及求深度等算法。
同时也需要我们掌握运用递归方式描述算法及编写递归C程序的方法,提高算法分析和程序设计能力。
通过课程设计的实践,我们可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
与此同时我们也熟练掌握数据结构这门课程,掌握线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用。
其次是通过对实验结构流程图图的设计,活跃我们的大脑思维,增强空间想象能力,让整个实验的程序过程更加简单明了,易于理解,对各种画图工具的熟练使用也达到了。
总之,通过这次实验,相信我会对数据结构这门课程的知识更加了解,掌握得更深,把以前在这门课程方面的不足弥补到,能重新认识到它的知识魅力所在,这将是我做这个课题后得到的最大收获。
2基本思想
在C语言的环境下,创建一个二叉树,由二叉树的递归定义可知,二叉树是由3个基本单元组成:
根结点,左子树,右子树。
若能遍历这三部分,便是遍历了整个二叉树。
首先,定义一个结构体,左,右孩子指针,同时分为先序遍历,中序遍历,后序遍历,程序的基本算法思想:
先序遍历二叉树,若二叉树为空,则空操作;否则
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。
中序遍历二叉树,若二叉树为空,则空操作;否则
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
后序遍历二叉树,若二叉树为空,则空操作;否则
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点。
叶子数的求法则是需要根据用层次遍历的算法,来算出每一层的叶子数,从而统计出整棵树的叶子数。
以上就是我做此实验的整个算法的基本思想
3方案设计
3.1方案的概要说明
用typedef声明TElemType为字符类型,BiNode为结构体类型,该二叉树的先序,中序,后序遍历分别在voidPreOrderTraverse(BiTreebt),voidInOrderTraverse(BiTreebt),voidPostOrderTraverse(BiTreebt)表示的程序中完成整个遍历过程。
主函数中依次输出所建立二叉树输出的先序,中序,后序遍历的结果,叶子数由层次遍历二叉树可得,也由主函数中输出。
3.2二叉树的建立和存储
建立二叉树(ABD#G###CE##FH###)。
结构定义:
typedefstructBiTNode
{
chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
经过对该二叉树的遍历,结果分别存储在PreOrder,InOrder,PostOrder中。
3.3数据的测试
已建立的二叉树(ABD#G###CE##FH###)
先序序列:
ABDGCEFH
中序序列:
DGBAECHF
后序序列:
GDBEHFCA
3.4程序结果的输出
输出结果的用print()实现,先序序列:
ABDGCEFH;中序序列:
DGBAECHF;后序序列:
GDBEHFCA;二叉树子叶数:
3
4算法设计
4.1程序整体流程图
构造二叉树,将值赋给bt所指的结点值,接着构造左子树,右子树。
在这期间,并判断该二叉树的结点值是否为空,在接下来的程序中依次先序,中序,后序遍历建立的二叉树,最后在主函数中输出所要的结果(图4.1):
图4.1
4.2先序遍历过程流程图
voidPreOrderTraverse(BiTreebt)//先序递归遍历二叉树
{if(bt)//bt不空
{
printf("%c",bt->data);//先访问结点
PreOrderTraverse(bt->lchild);//再先序遍历左子树
PreOrderTraverse(bt->rchild);//最后先序遍历右子树
}
}(图4.2):
图4.2
4.3中序遍历过程流程图
voidInOrderTraverse(BiTreebt)//中序递归遍历二叉树
{
if(bt)//bt不空
{
InOrderTraverse(bt->lchild);//先中序遍历左子树
printf("%c",bt->data);//再访问结点
InOrderTraverse(bt->rchild);//最后中序遍历右子树
}
}(图4.3)
图4.3
4.4后序遍历过程流程图
voidPostOrderTraverse(BiTreebt)//后序递归遍历二叉树
{
if(bt)//bt不空
{
PostOrderTraverse(bt->lchild);//先后序遍历左子树
PostOrderTraverse(bt->rchild);//然后后序遍历右子树
printf("%c",bt->data);//最后访问结点
}
}(图4.4)
图4.4
5详细设计
程序源代码(C语言)如下:
#include"stdio.h"
#include"string.h"
typedefcharTElemType;
typedefstructBiNode//定义二叉树节点结构
{
TElemTypedata;//数据域
structBiNode*lchild,*rchild;//左右孩子指针域
}BiNode,*BiTree;
BiTreeCreateBiTree(BiTreebt)//构造二叉链表表示的二叉树bt
{charch;
BiTreech=NULL;
ch=getchar();
if(ch=='#')bt=NULL;//空二叉树bt
else//结点的值不为空
{
if((bt=(BiNode*)malloc(sizeof(BiNode)))==NULL)
exit(-2);
bt->data=ch;//将值赋给bt所指结点
bt->lchild=CreateBiTree(h);//递归构造左子树
bt->rchild=CreateBiTree(h);//递归构造右子树
}
return(bt);
}
voidPreOrderTraverse(BiTreebt)//先序递归遍历二叉树
{if(bt)//bt不空
{
printf("%c",bt->data);//先访问结点
PreOrderTraverse(bt->lchild);//再先序遍历左子树
PreOrderTraverse(bt->rchild);//最后先序遍历右子树
}
}
voidInOrderTraverse(BiTreebt)//中序递归遍历二叉树
{
if(bt)//bt不空
{
InOrderTraverse(bt->lchild);//先中序遍历左子树
printf("%c",bt->data);//再访问结点
InOrderTraverse(bt->rchild);//最后中序遍历右子树
}
}
voidPostOrderTraverse(BiTreebt)//后序递归遍历二叉树
{
if(bt)//bt不空
{
PostOrderTraverse(bt->lchild);//先后序遍历左子树
PostOrderTraverse(bt->rchild);//然后后序遍历右子树
printf("%c",bt->data);//最后访问结点
}
}
main()
{
BiTreeT;//初始化树
T=CreateBiTree(NULL);//建立二叉树T
printf("\nthePreOrderis:
");
PreOrderTraverse(T);//先序递归遍历二叉树T
printf("\ntheInOrderis:
");
InOrderTraverse(T);//中序递归遍历二叉树T
printf("\nPostOrderis:
");
PostOrderTraverse(T);//后序递归遍历二叉树T
}
6调试分析
6.1调试运行程序
程序先序遍历二叉树运行结果如下(图6.1):
图6.1
由运行结果可知:
先序序列:
ABDGCEFH
中序序列:
DGBAECHF
后序序列:
GDBEHFCA
6.2运行结果的说明
首先,在编写程序的过程中,整个程序的大体编写比较顺利,就是在编写求叶子数的程序很困难,程序在调试过程中,无错误,但是在进入运行的过程中,无法显示该子叶数,经过多次的调试,改正,始终调试不出叶子显示数。
而只有当把有关的程序删除之后,先序便遍历二叉树和中序,后序遍历二叉树都能成功。
其结果显示如上图所示。
其次,在画流程图的过程中,由于对于画图工具的使用不熟悉,导致所需时间比较多,同时画出来的图没有达到非常标准。
与此同时,在源代码中,对定义二叉树的结构和用指针表示的那一段,由于有些是自己借鉴过来的,并不是很懂,程序如下:
typedefstructBiNode//定义二叉树节点结构
{
TElemTypedata;//数据域
structBiNode*lchild,*rchild;//左右孩子指针域
}BiNode,*BiTree;
BiTreeCreateBiTree(BiTreebt)//构造二叉链表表示的二叉树bt
{charch;
BiTreech=NULL;
ch=getchar();
if(ch=='#')bt=NULL;//空二叉树bt
else//结点的值不为空
{
if((bt=(BiNode*)malloc(sizeof(BiNode)))==NULL)
exit(-2);
bt->data=ch;//将值赋给bt所指结点
bt->lchild=CreateBiTree(h);//递归构造左子树
bt->rchild=CreateBiTree(h);//递归构造右子树
}
return(bt);
}
自己掌握得还不是很熟悉,通过自己翻查课本,网上查找有关相似程序源代码和请教同学,最终把它掌握得比较好,并熟知了程序的每一个步骤。
7课程设计总结
此次实验课题,遇到了很多问题,主要在对知识的掌握不牢固和程序的一些理解上的错误,造成了在程序的编写过程中有些地方重复了很多次和实验流程图的多次校正。
首先,二叉树的先序,中序,后序遍历的程序编写还比较顺利,但是对求叶子数程序的编写过程中,由于自己对此知识掌握得不是特别牢固,在这上面花费的时间比较多。
同时自己也没有放弃在这方面的努力,在查找书本知识,上网找资料和同学们的帮助下,自己也很好的完成了该程序的编写。
然后,在此次实验中的画流程图过程中,主要原因由于自己在过往平时的实验中没有在这方面引起重视,导致了自己在这方面的生疏和不足,实验流程图多次修改,最终在自己参考课本和研究程序的基础上,终于画出了令自己比较满意的图。
整个实验过程,我最感觉深刻的就是,这份实验课题完成得很不容易,虽然是自己在做实验之初就下定决心要将它做好
在这次实验中,不仅提高我对学到的课本知识实际解决问题的能力和动手能力,同时也加强我对所学知识的了解:
熟练掌握了树的基本概念、二叉树的基本操作及在链式存储结构上的实现和掌握二叉树的生成、遍历及求深度等算法,
同时更好的掌握了编写C程序的方法,提高了我自己的算法分析和程序设计能力。
通过自己发现问题和自己的不足,我做到了努力的去解决在实验课题中出现的问题,让我知道了此次实验在自己的努力完成之下,它也并不是我想象中的那么难。
同时让我熟悉了数据结构中的很多知识和一些画图上的技巧,确实是让我收益颇多,使得我对这次的自己做实验的过程有一种珍惜的感觉,真正的明白了一份努力一份收获的道理。
参考文献
[1]严蔚敏等,《数据结构题集》,清华大学出版社,2005
[2]严蔚敏等,《数据结构》(C语言版),清华大学出版社,2003
[3]马利克晏海华,《C++编程——数据结构与程序设计方法》,电子工业出版社,2003
[4]刘大有等,《数据结构课程设计》高等教育出版社,2004.
[5]宫纪明,《实用数据结构》,安徽大学出版社,2005
[6]张铭,《数据结构与算法》,高等教育出版社,2005
[7]余绍军,《数据结构》,中南大学出版社,2004