




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、二叉树基本操作演示程序的设计与实现2012级电器信息类X班 (姓名) (学号)注意:文档以word格式提供,文件名起名规则:学号+姓名+实验报告名称一、需求分析1、创建二叉树。按照用户需要的二叉树,构建二叉树。2、将创建的二叉树,以树状形式输出。3、分别以先序、中序、后序三种方式遍历访问二叉树。4、输出二叉树的叶子结点及叶子结点的个数。5、输出二叉树的高度。6、将创建的二叉树,以括号形式输出。二、概要设计为了实现以上功能,可以从三个方面着手设计。1、主界面设计为了实现二叉树相关操作功能的管理,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本程序。本系统主控菜单运行界
2、面如图1所示。首先请输入二叉树结点序列:请按菜单提示操作: -欢迎使用二叉树基本操作程序- 菜单选择 1. 树状输出二叉树 2. 先序遍历二叉树 3. 中序遍历二叉树 4. 后序遍历二叉树 5. 输出叶子结点 6. 输出叶子结点个数 7. 输出二叉树的深度 8. 括号形式输出二叉树9. 退出 -图1 二叉树基本操作程序主菜单2、存储结构设计本程序采用二叉链式存储类型(BiTNode)存储二叉树的结点信息。二叉树的链表中的结点至少包含3个域:数据域(data)、左孩子指针域(lchild)、右孩子指针域(rchild)。3、系统功能设计本程序除了完成二叉树的创建功能外还设置了9个子功能菜单。由于
3、这9个子功能都是建立在二叉树的构造上的,所以二叉树的创建由主函数main()实现。9个子功能的设计描述如下:树状输出二叉树。树状输出二叉树由函数TranslevelPrint()实现。当用户选择此功能时,系统即以树状的形式输出用户所创建的二叉树。先序遍历二叉树。由函数Preorder()实现。该功能按照先序遍历访问二叉树的方法输出先序序列。中序遍历二叉树。由函数Inorder()实现。该功能按照中序遍历访问二叉树的方法输出中序序列。后序遍历二叉树。由函数Postorder()实现。该功能按照后序遍历访问二叉树的方法输出后序序列。输出叶子结点。该功能采用先序遍历二叉树的方法依次输出叶子结点。由函
4、数Preorderleaf()实现。输出叶子结点个数。该功能计算并输出二叉树中叶子结点的个数,由LeafCount()实现。采用递归算法计算二叉树中叶子结点的个数,算法思想是:当二叉树为空树时,叶子结点总数为0;当二叉树只有1个结点时,叶子结点总数为1;否则,叶子结点个数等于左右子树叶子结点数之和。输出二叉树的深度。该功能输出二叉树的深度,由函数PostorderDepth()实现,采用后序遍历的递归算法求二叉树的深度。括号形式输出二叉树。以括号形式输出二叉树由函数,由函数output()实现。当用户选择此功能时,系统即以括号形式输出二叉树。退出。由exit(0)函数实现。三、模块设计1、模块
5、设计本程序包含三个模块,主程序模块、建立二叉树模块和工作区选择模块。其调用关系如图2所示。主程序模块建立二叉树模块工作区选择模块图2 模块调用示意图2、系统子程序用功能设计本系统共设置12个子程序,各子程序的函数名及功能说明如下:void CreateBiTree(BiTree &T) /先序建立二叉树void TranslevelPrint(BiTree T) /树形打印二叉树void Visit(char ch) /输出结点void Preorder(BiTree T) /先序遍历二叉树void Inorder(BiTree T) /中序遍历二叉树void Postorder(BiTree
6、 T) /后序遍历二叉树void PreorderLeaf(BiTree T) /输出叶子结点int LeafCount(BiTree T) /输出叶子结点的个数int PostorderDepth(BiTree T) /输出二叉树的深度void output(BiTree T) /以括号形式输出二叉树void mainwork() /主工作函数,操作区用户界面void main() /主函数。创建二叉树,调用工作区模块函数3、函数主要调用关系图本系统12个子程序之间的主要调用关系如图3所示。图中数字是各函数的编号。图3系统函数调用关系图四、详细设计1、数据类型定义typedef struct
7、 BiTNode /定义二叉树结点结构 char data; struct BiTNode *lchild,*rchild;BiTNode,*BiTree;2、系统主要子程序详细设计主函数模块主函数。创建二叉树,调用工作区模块函数。void main() cout首先请输入二叉树结点序列: n; CreateBiTree(T); coutch; if(ch=#) T=NULL; else T=new BiTNode; T-data=ch; CreateBiTree(T-lchild); CreateBiTree(T-rchild); 用户工作区模块主工作函数,操作区用户界面设计。void ma
8、inwork() int yourchoice; coutn-欢迎使用二叉树基本操作程序-n; coutn 菜单选择 nn; cout 1. 树状输出二叉树 2. 先序遍历二叉树 n; cout 3. 中序遍历二叉树 4. 后序遍历二叉树 n; cout 5. 输出叶子结点 6. 输出叶子结点个数 n; cout 7. 输出二叉树的深度 8. 括号形式输出二叉树 n; cout 9. 退出 n; coutn-n; coutyourchoice; while(!(yourchoice=1|yourchoice=2|yourchoice=4|yourchoice=5| yourchoice=6|y
9、ourchoice=7|yourchoice=8|yourchoice=9) coutyourchoice; while(1) switch(yourchoice) case 1:cout树的形状为:; TranslevelPrint(T);break; case 2:cout先序遍历为:; Preorder(T);break; case 3:cout中序遍历为:; Inorder(T);break; case 4:cout后序遍历为:; Postorder(T);break; case 5:cout叶子结点为:; PreorderLeaf(T);break; case 6:cout叶子结点个
10、数为:LeafCount(T);break; case 7:cout二叉树的深度为:PostorderDepth(T);break; case 8:cout括号形式输出二叉树为:;output(T);break; case 9:system(cls); exit(0); break; default: break; coutn按任意键继续:; getch(); system(cls); coutn-欢迎使用二叉树基本操作程序-n; coutn 菜单选择 nn; cout 1. 树状输出二叉树 2. 先序遍历二叉树 n; cout 3. 中序遍历二叉树 4. 后序遍历二叉树 n; cout 5.
11、 输出叶子结点 6. 输出叶子结点个数 n; cout 7. 输出二叉树的深度 8. 括号形式输出二叉树 n; cout 9. 退出 n; coutn-n; coutyourchoice; /endwhile(1)/endmainwork五、测试结果根据先根结点,按照从上到下,从左到右的次序依次先根遍历的方法,分别输入二叉树的结点序列(#号表示该结点为空)。例如,输入“ABD#E#CH#”,程序运行得到如图1所示的开始界面。各子功能测试运行结果如下。1、树状输出二叉树在主菜单下,用户输入1并回车,运行结果如图4所示。 图4 按树形输出所创建的二叉树2、先序遍历二叉树在主菜单下,用户输入2并回车
12、,运行结果如图5所示。图5 输出二叉树的先序遍历序列3、中序遍历二叉树在主菜单下,用户输入3并回车,运行结果如图6所示。4、后序遍历二叉树在主菜单下,用户输入4并回车,运行结果如图7所示。 图6 输出二叉树的中序遍历序列 图7 输出二叉树的后序遍历序列5、输出叶子结点在主菜单下,用户输入5并回车,运行结果如图8所示。6、输出叶子结点个数在主菜单下,用户输入6并回车,运行结果如图9所示。 图8 输出二叉树的叶子结点 图9输出二叉树的叶子结点个数7、输出二叉树的深度在主菜单下,用户输入7并回车,运行结果如图10所示。8、括号形式输出二叉树在主菜单下,用户输入8并回车,运行结果如图11所示。 图10
13、 输出二叉树的深度 图11 以括号形式输出二叉树9、退出在主菜单下,用户输入9并回车,即退出“二叉树基本操作程序”。六、用户使用说明1、本程序执行文件为“二叉树的基本操作演示.exe”。2、进入本程序后,首先按照提示输入二叉树的结点,如按下列次序顺序读入字符ABD#E#CH#。 3、随即显示系统主菜单界面,用户可在该界面下输入各功能前对应的数字并按回车,执行相应命令。七、实验体会(略)八、源程序清单/二叉树基本操作演示程序的设计与实现/二叉树的基本操作演示.CPP#include #include stdlib.h#include conio.h#include math.h#define M
14、axSize 100#define NLAYER 4typedef struct BiTNode char data; struct BiTNode *lchild,*rchild;BiTNode,*BiTree;BiTree T;/1.建立二叉树void CreateBiTree(BiTree &T)/先序建立二叉树 char ch; cinch; if(ch=#) T=NULL; else T=new BiTNode; T-data=ch; CreateBiTree(T-lchild); CreateBiTree(T-rchild); /2.树形打印二叉树void TranslevelPr
15、int(BiTree T) /本算法实现二叉树按层打印 struct node BiTree vecMaxSize; /存放树结点 int layerMaxSize; /结点所在的层 int locateMaxSize; /打印结点的位置int front,rear; q; /定义队列q int i,j=1,k=0,nLocate; q.front=q.rear=0; /初始化队列q队头、队尾 coutn ; q.vecq.rear=T; /二叉树的根结点入队 q.layerq.rear=1; q.locateq.rear=20; q.rear=q.rear+1; while(q.frontq
16、.rear) T=q.vecq.front; i=q.layerq.front; nLocate=q.locateq.front; if(ji) /进层打印时换行 coutnn; j=j+1; k=0; while(k+nLocate) cout ;while(k+nLocate-1) cout ; /结点深度控制横向位置coutdata;q.front=q.front+1;if(T-lchild!=NULL) /存在左子树,将左子树的根结点入队列 q.vecq.rear=T-lchild; q.layerq.rear=i+1; q.locateq.rear=int(nLocate-pow(2
17、,NLAYER-i-1); q.rear=q.rear+1;if(T-rchild!=NULL) /存在右子树,将右子树的根结点入队列 q.vecq.rear=T-rchild; q.layerq.rear=i+1; q.locateq.rear=int(nLocate+pow(2,NLAYER-i-1); q.rear=q.rear+1; /3.输出结点void Visit(char ch) coutdata); /访问根结点 Preorder(T-lchild); /先序遍历左子树 Preorder(T-rchild); /先序遍历右子树 /5.中序遍历二叉树void Inorder(Bi
18、Tree T)/中序遍历二叉树,T为指向二叉树(或某一子树)根结点的指针 if(T!=NULL) Inorder(T-lchild); /中序遍历左子树 Visit(T-data); /访问根结点 Inorder(T-rchild); /中序遍历右子树 /6.后序遍历二叉树void Postorder(BiTree T)/后序遍历二叉树,T为指向二叉树(或某一子树)根结点的指针 if(T!=NULL) Postorder(T-lchild); /后序遍历左子树 Postorder(T-rchild); /后序遍历右子树 Visit(T-data); /访问根结点 /7.输出叶子结点void P
19、reorderLeaf(BiTree T)/先序遍历二叉树并输出叶子结点,T为指向二叉树根结点的指针 if(T!=NULL) if(T-lchild=NULL&T-rchild=NULL) Visit(T-data); /访问根结点 PreorderLeaf(T-lchild); /先序遍历左子树 PreorderLeaf(T-rchild); /先序遍历右子树 /8.输出叶子结点的个数int LeafCount(BiTree T) int LeafNum; if(T=NULL) LeafNum=0; else if(T-lchild=NULL)&(T-rchild=NULL) LeafNum
20、=1; else LeafNum=LeafCount(T-lchild)+LeafCount(T-rchild); return LeafNum;/9.输出二叉树的深度int PostorderDepth(BiTree T) /后序遍历求二叉树深度的递归算法 int hl,hr,max; if(T!=NULL) hl=PostorderDepth(T-lchild); /求左子树的深度 hr=PostorderDepth(T-rchild); /求右子树的深度 max=hlhr?hl:hr; /得到左右子树深度较大者 return (max+1); /返回树的深度 else return 0;
21、 /空树返回0/10. 以括号形式输出二叉树void output(BiTree T) if(T!=NULL) coutdata; if(T-lchild!=NULL|T-rchild!=NULL) coutlchild); if(T-rchild!=NULL) coutrchild); cout); /11.主工作函数,操作区用户界面void mainwork() int yourchoice; coutn-欢迎使用二叉树基本操作程序-n; coutn 菜单选择 nn; cout 1. 树状输出二叉树 2. 先序遍历二叉树 n; cout 3. 中序遍历二叉树 4. 后序遍历二叉树 n; cout 5. 输出叶子结点 6. 输出叶子结点个数 n; cout 7. 输出二叉树的深度 8. 括号形式输出二叉树 n; cout 9. 退出 n; coutn-n; coutyourchoice; while(!(yourchoice=1|yourchoice=2|yourchoice=4|yourchoice=5| yourchoice=6|yourchoice=7|yourchoice=8|yourchoice=9) coutyourchoice; while(1) switch(yourc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论