唯一的确定一棵二叉树(共12页).doc

上传人:飞****2 文档编号:13842297 上传时间:2022-05-01 格式:DOC 页数:12 大小:66.50KB
返回 下载 相关 举报
唯一的确定一棵二叉树(共12页).doc_第1页
第1页 / 共12页
唯一的确定一棵二叉树(共12页).doc_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《唯一的确定一棵二叉树(共12页).doc》由会员分享,可在线阅读,更多相关《唯一的确定一棵二叉树(共12页).doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上数据结构课程设计唯一的确定一棵二叉树 n 指导教师:n 设计人: n 班级: n 学号: 设计时间:2011年4月18实习二 树、图及其应用题目:唯一的确定一棵二叉树实习时间:2011.4.15一、需求分析:1. 如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。试编写实现上述功能的程序。已知一棵二叉树的前序和中序序列,设计完成下列任务的一个算法:(1)构造一棵二叉树;(2)证明构造正确(即分别以前序和中序遍历该树,将得到的结果与给出的序列进行比较)。2.测试数据:前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC。二、设计:n 设计

2、思想(1)存储结构:二叉树 ,用两个一维数组A和B分别存放前序和中序序列。(2)主要算法基本思想:将前序和中序序列分别读入数组A和B。根据定义,前序序列中第一个元素一定是树根,在中序序列中该元素之前的所有元素一定在左子树中,其余元素则在右子树中。所以,首先从数组A中取出第一个元素A0作根结点,然后在数组B中找到A0,以它为界,在其前面的是左子树中序序列,在其后面的是右子树中序序列。若左子树不为空,沿前序序列向后移动,找到左子树根结点,转。左子树构造完毕后,若右子树不为空,沿前序序列向后移动,找到右子树根结点,转。前序序列中各元素取完则二叉树构造完毕。对二叉树进行前序和中序遍历,并将结果分别与数

3、组A和B进行比较,若相同,则证明二叉树构造正确。n 设计表示(1)函数调用关系图:main Initiate CreateTreePrintBiTreePreOrder VisitInOrder VisitPostOrder(2)函数接口规格说明:void Initiate(BiTNode *root)/初始化二叉树的头结点void Visit(char item)/访问操作void PreOrder(BiTNode *T,void Visit(char item)/前序遍历二叉树void InOrder(BiTNode *T,void Visit(char item)/中序遍历二叉树void

4、 PostOrder(BiTNode *T,void Visit(char item)/后序遍历二叉树void PrintBiTree(BiTNode *T,int n)/显示二叉树void CreateTree(BiTNode *T,int pre_f,int pre_l,int in_f,int in_l,char pre,char in)/按要求创建二叉树n 实现注释 (1)根据前序遍历和后序遍历创建二叉树,并后序遍历该二叉树。(2)二叉树逆转90度来显示。n 详细设计 总体来说,本程序设计相对比较简单,主要包括七个功能模块:初始化函数、前序遍历二叉树函数、中序遍历二叉树函数、后序遍历二

5、叉树函数、显示函数、创建二叉树函数、 主函数。下面分别给予介绍: 初始化函数void Initiate(BiTNode *root)*root=(BiTNode *)malloc(sizeof(BiTNode);(*root)-LeftChild=NULL;(*root)-RightChild=NULL; 前序遍历二叉树函数void PreOrder(BiTNode *T,void Visit(char item)if(T!=NULL) Visit(T-data); PreOrder(T-LeftChild,Visit); PreOrder(T-RightChild,Visit); 中序遍历二

6、叉树函数void InOrder(BiTNode *T,void Visit(char item)if(T!=NULL) InOrder(T-LeftChild,Visit); Visit(T-data); InOrder(T-RightChild,Visit); 后序遍历二叉树函数void PostOrder(BiTNode *T,void Visit(char item)if(T!=NULL) PostOrder(T-LeftChild,Visit); PostOrder(T-RightChild,Visit); Visit(T-data); 显示函数void PrintBiTree(Bi

7、TNode *T,int n)int i;if(T=NULL) return;PrintBiTree(T-RightChild,n+1);for(i=0;i=0) printf(_); printf(%cnn,T-data);PrintBiTree(T-LeftChild,n+1); 创建二叉树函数void CreateTree(BiTNode *T,int pre_f,int pre_l,int in_f,int in_l,char pre,char in)int interval=0;/int same=in_f;if(prepre_f!=insame) while(prepre_f!=i

8、nsame)/在中序序列中找到根节点 same+; interval+; if(interval=0)&(pre_f=pre_l) /找到了叶节点,也是递归出口 T-data=prepre_f; T-LeftChild=NULL; T-RightChild=NULL;if(interval!=0)&(intervalLeftChild=(BiTNode *)malloc(sizeof(BiTNode); T-RightChild=(BiTNode *)malloc(sizeof(BiTNode); T-data=prepre_f; CreateTree(T-LeftChild,pre_f+1,

9、pre_f+interval,in_f,in_f+interval-1,pre,in); CreateTree(T-RightChild,pre_f+interval+1,pre_l,in_f+interval+1,in_l,pre,in);if(interval!=0)&(interval=pre_l-pre_f)/只有左子树 T-LeftChild=(BiTNode *)malloc(sizeof(BiTNode); T-data=prepre_f; CreateTree(T-LeftChild,pre_f+1,pre_l,in_f,in_f+interval-1,pre,in); T-R

10、ightChild=NULL;if(interval=0)&(pre_f!=pre_l)/只有右子树 T-RightChild=(BiTNode *)malloc(sizeof(BiTNode); T-data=prepre_f; T-LeftChild=NULL; CreateTree(T-RightChild,pre_f+interval+1,pre_l,in_f+interval+1,in_l,pre,in); 主函数void main()BiTNode *T;int Pre_len,In_len;char PreMaxSize;/前序序列char InMaxSize;/中序序列prin

11、tf(请输入前序序列:n);scanf(%s,&Pre);Pre_len=strlen(Pre);printf(请输入中序序列:n);scanf(%s,&In);In_len=strlen(In);Initiate(&T);CreateTree(T,0,Pre_len-1,0,In_len-1,Pre,In);printf(二叉树构造成功!n);printf(逆时针旋转90度的二叉树如下所示:n);PrintBiTree(T,0);printf(前序序列:n);PreOrder(T,Visit);printf(n中序序列:n);InOrder(T,Visit);printf(n后序序列:n);

12、PostOrder(T,Visit);printf(n);三、调试分析:本程序在设计过程中遇到一个难题,那就是如何正确显示所构造的二叉树,试了几种方法都不理想,最后想到让二叉树逆时针旋转后再显示,具备可行性,同时也使之更美观。经验和体会经过第一次一元稀疏多项式加法的课程设计,这次课程设计就显得轻车熟路了,运算的主要设计思路很容易想到,大体设计结构在较短时间内能够完成,但当设计到具体细节代码时遇到了一些困难,主要困难是进行结点操作时,对指针考虑得不够细致,调试时常出现指针指错的情况,没有认真理清条件层次,另一个困难是如何正确显示所构造的二叉树。虽然程序可能并不是最高效的,而且不够健壮,但也符合题

13、目的要求,总的来说本次课程设计还算圆满。本次课程设计培养了我对实际问题的分析能力以及解决一些实际问题的能力,巩固了我的编程思想和写程序的能力。课程设计是对我们的学习很有利的一个环节,在这个阶段,我们学会把理论与实际的结合、懂得人与人沟通的重要性,通过这次课程设计中,我加深了对课本知识的理解。四、用户手册:本程序在Visual C + 6.0下运行。先输入前序遍历序列,回车,再输入中序遍历序列,再回车,即可得出结果。五、运行结果: 六、源程序清单:#include #include #include #define MaxSize 50typedef struct Nodechar data;s

14、truct Node *LeftChild;struct Node *RightChild;BiTNode;void Initiate(BiTNode *root)*root=(BiTNode *)malloc(sizeof(BiTNode);(*root)-LeftChild=NULL;(*root)-RightChild=NULL;void Visit(char item)printf(%c,item);void PreOrder(BiTNode *T,void Visit(char item)if(T!=NULL) Visit(T-data); PreOrder(T-LeftChild,

15、Visit); PreOrder(T-RightChild,Visit);void InOrder(BiTNode *T,void Visit(char item)if(T!=NULL) InOrder(T-LeftChild,Visit); Visit(T-data); InOrder(T-RightChild,Visit);void PostOrder(BiTNode *T,void Visit(char item)if(T!=NULL) PostOrder(T-LeftChild,Visit); PostOrder(T-RightChild,Visit); Visit(T-data);v

16、oid PrintBiTree(BiTNode *T,int n)int i;if(T=NULL) return;PrintBiTree(T-RightChild,n+1);for(i=0;i=0) printf(_); printf(%cnn,T-data);PrintBiTree(T-LeftChild,n+1);void CreateTree(BiTNode *T,int pre_f,int pre_l,int in_f,int in_l,char pre,char in)int interval=0;/int same=in_f;if(prepre_f!=insame) while(p

17、repre_f!=insame)/在中序序列中找到根节点 same+; interval+; if(interval=0)&(pre_f=pre_l) /找到了叶节点,也是递归出口 T-data=prepre_f; T-LeftChild=NULL; T-RightChild=NULL;if(interval!=0)&(intervalLeftChild=(BiTNode *)malloc(sizeof(BiTNode); T-RightChild=(BiTNode *)malloc(sizeof(BiTNode); T-data=prepre_f; CreateTree(T-LeftChil

18、d,pre_f+1,pre_f+interval,in_f,in_f+interval-1,pre,in); CreateTree(T-RightChild,pre_f+interval+1,pre_l,in_f+interval+1,in_l,pre,in);if(interval!=0)&(interval=pre_l-pre_f)/只有左子树 T-LeftChild=(BiTNode *)malloc(sizeof(BiTNode); T-data=prepre_f; CreateTree(T-LeftChild,pre_f+1,pre_l,in_f,in_f+interval-1,pr

19、e,in); T-RightChild=NULL;if(interval=0)&(pre_f!=pre_l)/只有右子树 T-RightChild=(BiTNode *)malloc(sizeof(BiTNode); T-data=prepre_f; T-LeftChild=NULL; CreateTree(T-RightChild,pre_f+interval+1,pre_l,in_f+interval+1,in_l,pre,in);void main()BiTNode *T;int Pre_len,In_len;char PreMaxSize;/前序序列char InMaxSize;/中序

20、序列printf(请输入前序序列:n);scanf(%s,&Pre);Pre_len=strlen(Pre);printf(请输入中序序列:n);scanf(%s,&In);In_len=strlen(In);Initiate(&T);CreateTree(T,0,Pre_len-1,0,In_len-1,Pre,In);printf(二叉树构造成功!n);printf(逆时针旋转90度的二叉树如下所示:n);PrintBiTree(T,0);printf(前序序列:n);PreOrder(T,Visit);printf(n中序序列:n);InOrder(T,Visit);printf(n后序序列:n);PostOrder(T,Visit);printf(n);专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁