数据结构实验报告(二叉树的基本操作)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与技术数据结构实验报告二叉树基本操作演示程序
班级:计科1202班
姓名:***
学号:**********
时间:2013.11.16
实验内容
设计一个与二叉树基本操作相关的演示程序,要求实现以下功能:
(1)创建二叉树。按照用户需要的二叉树,构建二叉树。
(2)将创建的二叉树以树状形式输出。
(3)分别以先序,中序,后序三种遍历方式访问二叉树。
(4)输出二叉树的叶子结点以及叶子结点的个数。
(5)输出二叉树的高度。
实验目的
(1)掌握二叉树的存储实现。
(2)掌握二叉树的遍历思想。
(3)掌握二叉树常见算法的程序实现。
概要设计
主界面设计
为了实现二叉树相关功能的管理,需要设计一个含有多个菜单项的主控菜单子程序以链接系统的各个子功能,方便用户使用本程序。
存储结构设计
本程序采用二叉链式存储结构(BiTNode)存储二叉树的结点信息。二叉树的链表中的结点至少包括三个域:数据域(data),左孩子指针域(LChild),右孩子指针域(RChild)。
系统功能设计
本程序除了完成二叉树的创建功能外,还设置了8个子功能菜单。由于这8个子功能都是建立在二叉树的构造上,所以二叉树的创建由主函数main()完成。8个子功能设计描述如下:
(1)树状输出二叉树。树状输出二叉树由函数TranslevelPrint()实现。当用户选择该功能时,系统以树状的形式输出用户所创建的二叉树。
(2)先序遍历二叉树。由函数PreOrder()实现。该功能按照先序遍历访问二叉树的方法输出先序序列。
(3)中序遍历二叉树。由函数InOrder()实现。该功能按照中序遍历访问二叉树的方法输出中序序列。
(4)后序遍历二叉树。由函数PostOrder()实现。该功能按照后序遍历访
问二叉树的方法输出后序序列。
(5)输出叶子结点。该功能采用先序遍历二叉树的方法,依次输出叶子结点。由函数PreOrderLeaf()实现。
(6)输出叶子结点个数。该功能计算并输出二叉树叶子结点的个数,由LeafCount()函数实现。采用递归算法计算二叉树叶子结点的个数,算法思想是:当二叉树为空时,叶子总结点数为0;当二叉树只有一个结点时,叶子结点个数为1;否则,叶子结点总数为左右子树结点之和。
(7)输出二叉树的深度。该功能即输出二叉树结点所在层次的最大值。由函数PostOrderDepth()实现。
(8)退出。由函数exit()实现。
详细设计
详细设计参见附录源代码。
测试结果
(1)首先输入二叉树结点:
(2)出现主界面:
(3)分别选择不同的功能即可得到不同的结果:
树状输出:
先序,中序,后序遍历分别显示如下:
(4)选择功能5,6,7即可出现叶子结点,叶子结点的个数,和该二叉树的深度
最后,选择功能8,退出该系统。
实验心得
(1)总结本次实习的收获
通过本次实验,加强了对二叉树的认识与相关操作的算法、编程实现;通过实验,我熟悉二叉树树的基本操作,掌握二叉树的实现以及实际应用。加深了对二叉树的理解,逐步培养解决实际问题的编程能力以及进一步了解了二叉树图转化为括号表示法。递归的使用,要注意,初始时的状态以及如何使用递归,注意普遍性,思考时从普通的开始。通过这次上机操作,让我明白书本上的程序一定要自己去调试,这样才能将书本程序与老师讲的内容融会贯通,达到温故而知新
(2)本系统的不足之处
系统的健壮行不够强
代码不够优化。
(3)遇到的困难
对于一些不会编译的程序,通过百度会了求叶子结点数,然后仿照求叶子结点数的方法,自己编出了求度为2的结点数的算法,学会了很多东西,对编程更加有兴趣了。
附录
源代码:
#include
#include
#include
#include
#define MAXLEN 100
#define NLAYER 4
typedef struct BiTNode
{
/* data */
char data;
struct BiTNode *LChild,*RChild;
}BiTNode,*BiTree;
BiTree T;
//建立二叉树
void CreatBiTree(BiTree *bt)//按照先序序列建造二叉树
{
char ch;
scanf("%c",&ch);
if(ch=='#') *bt=NULL;
else
{
*bt=(BiTree)malloc(sizeof(BiTNode));//生成一个新的结点
(*bt)->data=ch;
CreatBiTree(&((*bt)->LChild));//生成左子树
CreatBiTree(&((*bt)->RChild));
}
}
//树形打印二叉树
void TranslevelPrint(BiTree bt)
{
//本算法实现二叉树的按层打印
struct node
{
/* data */
BiTree vec[MAXLEN];//存放树结点
int layer[MAXLEN];//结点所在的层
int locate[MAXLEN];//打印结点的位置
int front,rear;
}q; //定义队列q
int i,j=1,k=0,nlocate;
q.front=0; q.rear=0;//初始化队列q队头,队尾printf(" ");
q.vec[q.rear]=bt;//将二叉树根节点入队列
yer[q.rear]=1;
q.locate[q.rear]=20;
q.rear=q.rear+1;
while(q.front { bt=q.vec[q.front]; i=yer[q.front]; nlocate=q.locate[q.front]; if (j { printf("\n\n"); j=j+1; k=0; while(k { printf(" "); k++; } } while(k<(nlocate-1)) { printf(" "); k++; }