版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验六 二叉树的递归遍历及其应用1、 实验目的1、 深入了解二叉树递归的逻辑结构特征及其基本操作。2、 了解二叉树各种存储结构的特点及其适用范围,熟练掌握二叉树的二叉链表结构的定义及其递归遍历算法、按层次遍历算法的c语言实现,能深入了解递归算法的执行过程。3、 熟练掌握二叉树递归遍历算法的应用。一、实验内容和要求2、设计并验证如下算法:与“12.7.4参考源程序”类似,按中序序列输入建立两棵二叉树的二叉链表结构,求双分支结点数,判断两棵树是否相等。3、设计并验证如下算法:按层次遍历二叉树,打印结点所在的层次,并求该二叉树的宽度。二、实验过程及结果(第一题)1、 需求分析1、 从键盘输入二叉树的
2、序列,但由于建树是从根结点往下建立的,故只能输入先序序列,则按照中序建树完成二叉树的创建。2、从键盘输入一段正确的序列后,按回车键自动生成二叉树,若该序列不能生成一颗二叉树,则程序无法继续进行,只能退出。3、 程序能实现的功能包括:初始化二叉树;创建一棵完整二叉树;先中后序遍历二叉树;求二叉树双分支结点数;比较两棵二叉树是否相等; 2、 概要设计1、二叉树的抽象数据类型定义:ADT BinaryTree数据对象D:D是具有相同特征的数据元素的集合。数据关系R:若D=空,则R=空,称BinaryTree为空二叉树;若D!=空,则R=H,H是如下二元关系:(1) 在D中存在唯一的称为根的数据元素r
3、oot,它在关系H下无前驱;(2) 若D-root!=,则存在D-root=D1,Dr,且D1Dr=;(3) 若D1!=,则D1中存在唯一元素x1,<root,x1>H,且存在D1上的关系H1包含于H;若Dr!=,则Dr中存在唯一的元素,<root,xr>H,且存在Dr上的的关系Hr包含于H;H=<root,x1>,<root,xr>,H1,Hr;(4) (D1,H1)是一棵符合本定义的二叉树,称为根的左子树,(Dr,Hr)是一棵符合本定义的二叉树,称为根的右子树。基本操作: InitBiTree(&BT)操作结果:构造空二叉树Creat
4、eBiTree(&BT)操作结果:建立二叉树PreOrder(BT)初始条件:二叉树BT已存在操作结果:先序遍历InOrder(BT)初始条件:二叉树BT已存在操作结果:中序遍历PostOrder(BT)初始条件:二叉树BT已存在 操作结果:后序遍历Do_BranNumber(BT)初始条件:二叉树BT已存在操作结果:求BT的双分支结点数Same_CompareTree(BT_a,BT1_b)初始条件:二叉树BT_a、BT_b已存在操作结果:比较两棵树是否相等ADT BinaryTree; 本程序模块结构1 主函数模块void main()初始化两颗二叉树;创建二叉树BT_a,返回根结
5、点BT_a;getchar();创建二叉树BT_b,返回根结点BT_b;getchar();先、中、后序遍历BT_a和BT_b;if(两棵树相等)printf("相同");elseprintf("不同");输出BT_a和BT_b的双分支结点数; 三、详细设计1、基本数据类型操作二叉链表的存储结构typedef char TElemType;typedef struct BiTNode TElemType data; struct BiTNode *lchild,*rchild;/左右孩子指针BiTNode,*BiTree; 四、调试分析1、创建两棵二叉树
6、程序便不能继续运行,只能创建一棵树,加了getchar()后便能操作,原因可能是换行符造成的。2、进行两棵树的比较时不仅要保证各结点值相等,还要确保结构相同,若结构不同,两棵树则不等,故采用递归算法。3、求双分支结点数采用递归算法,一定要保证结束条件,此结束条件应为结点为空时返回0。 五、用户说明及测试结果1、两棵二叉树不相等2、两颗二叉树相等七、附录(源代码及部分注释)#include "stdio.h"#include "stdlib.h"#include "conio.h"#include "string.h"
7、;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -1#define INFEASIBLE -2#define Max_Tree_SIZE 20/最大结点数typedef int Status;typedef char TElemType;typedef struct BiTNode TElemType data; struct BiTNode *lchild,*rchild;/左右孩子指针BiTNode,*BiTree;Status InitBiTree(BiTree *BT);/构造空二叉树S
8、tatus CreateBiTree(BiTree *BT);/建立二叉树Status PreOrder(BiTree BT);/先序遍历Status InOrder(BiTree BT);/中序遍历Status PostOrder(BiTree BT);/后序遍历int Do_BranNumber(BiTree BT);/求双分支结点数Status Same_CompareTree(BiTree BT,BiTree BT1);/比较两棵树是否相等void main()int flag=1,select;BiTree BT_a,BT_b;InitBiTree(&BT_a);InitBi
9、Tree(&BT_b);printf("To Create Binary Tree, Please Input PreOrder with '#' :n");/输入二叉树的先序序列,用#代表空结点printf("Create The First Of Binary Tree(a): ");CreateBiTree(&BT_a);/创建二叉树,返回根结点BT_agetchar();printf("Create The Second Of Binary Tree(b): ");CreateBiTree(&a
10、mp;BT_b);/创建二叉树,返回根结点BT_bgetchar();printf("The First Of Binary Tree(a) is:n");printf("PreOrder Traversal: ");PreOrder(BT_a);/先序遍历printf("nInOrder Traversal: ");InOrder(BT_a);/中序遍历printf("nPostOrder Traversal: ");PostOrder(BT_a);/后序遍历printf("nnThe Second O
11、f Binary Tree(b) is:n");printf("PreOrder Traversal: ");PreOrder(BT_b);/先序遍历printf("nInOrder Traversal: ");InOrder(BT_b);/中序遍历printf("nPostOrder Traversal: ");PostOrder(BT_b);/后序遍历if(Same_CompareTree(BT_a,BT_b)printf("nnThe Binary Tree a and B is Same!n");
12、elseprintf("nnThe Binary Tree a and B is Different!n");printf("nThe Binary Tree a's Number of Double Branch is: %d",Do_BranNumber(BT_a);printf("nThe Binary Tree b's Number of Double Branch is: %dnn",Do_BranNumber(BT_b);/*InitBiTree*/Status InitBiTree(BiTree *BT)
13、/构造空二叉树*BT=NULL;return OK;/*CreateBiTree*/Status CreateBiTree(BiTree *BT)/建立二叉树TElemType ch;scanf("%c",&ch);if(ch!='#')*BT=(BiTree)malloc(sizeof(BiTNode);if(!(*BT)return OVERFLOW;CreateBiTree(&(*BT)->lchild);/构造左子树(*BT)->data=ch;CreateBiTree(&(*BT)->rchild);/构造
14、右子树else*BT=NULL;/读入#,返回空指针return OK;/*PreOrder*/Status PreOrder(BiTree BT)/先序遍历if(BT)if(!(BT->data)return ERROR;printf("%c",BT->data);/访问结点PreOrder(BT->lchild);/先序遍历左子树PreOrder(BT->rchild);/先序遍历右子树return OK;/*InOrder*/Status InOrder(BiTree BT)/中序遍历if(BT)if(!(BT->data)return
15、ERROR;InOrder(BT->lchild);/中序遍历左子树printf("%c",BT->data);/访问结点InOrder(BT->rchild);/中序遍历右子树return OK;/*PostOrder*/Status PostOrder(BiTree BT)/后序遍历if(BT)if(!(BT->data)return ERROR;PostOrder(BT->lchild);/后序遍历左子树PostOrder(BT->rchild);/后序遍历右子树printf("%c",BT->data);
16、/访问结点return OK;/*Do_BranNumber*/int Do_BranNumber(BiTree BT)if(!BT)return 0;elseif(BT->lchild&&BT->rchild)return Do_BranNumber(BT->lchild)+Do_BranNumber(BT->rchild)+1;elsereturn Do_BranNumber(BT->lchild)+Do_BranNumber(BT->rchild);/*Same_Compare*/Status Same_CompareTree(BiTree BT,BiTree BT1)/递归遍历并比较 if(BT=NULL&&BT1=NULL) return TRUE; /两棵树均为空时认为相等else if(BT=NULL|BT1=NULL)return FALSE; else if(BT!=NULL&&BT1!=NULL) if(BT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 珍稀动物养殖租赁协议
- 企业定制房产合同范本
- 咖啡馆地坪施工协议
- 智能家居电工招聘合同样本
- 八年级道德与法治开学摸底考试卷(山东济南卷)(答题卡)A4版
- 佛山市办公写字楼租赁合同样本
- 商务接待公寓租赁合同模板
- 研发工程师聘用合同
- 研究所墙地砖铺设合同
- 双方终止租房合同范例
- 仪表-xk3102s使用手册
- 社会学概论第五章 社会互动课件
- 2022全国119消防安全日消防安全主题班会课件
- 内蒙古通辽市基层诊所医疗机构卫生院社区卫生服务中心村卫生室地址信息
- 《安宁疗护评估表》《安宁共同照护表》
- 电影票采购合同(最新修订版)
- 《中国的疆域》 完整版课件
- 四川省泸州市各县区乡镇行政村村庄村名居民村民委员会明细
- 零星采购条件及流程
- 英语教学PPT课件:Say-No-to-Bullying
- 压力 课件- 高二心理健康
评论
0/150
提交评论