唯一的确定一棵二叉树.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
唯一的确定一棵二叉树

数据结构上机习报告姓名: 学号: 班级:【实习二】唯一的确定一棵二叉树目录1.需求分析22.设计2(1)设计思想2(2)概要设计3(3)详细设计33.调试分析74.用户手册75.测试结果86.源程序清单8需求分析【问题描述】 如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。试编写实现上述功能的程序。 【基本要求】已知一棵二叉树的前序和中序序列,试设计完成下列任务的一个算法:(1)构造一棵二叉树;(2) 证明构造正确(即分别以前序和中序遍历该树,将得到的结果与给出的序列进行比较)。(3)对该二叉树进行后序遍历,输出后序遍历序列。(4)用凹入法输出该二叉树。【测试数据示例】 前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC设计【设计思想】(1)一棵二叉树,我们知道了其前序遍历和中序遍历,则可以唯一确定。(2) 用数学归纳法证明由这两个序列能够唯一地确定一棵二叉树B t.假设一棵二叉树中结点的个数为n, 即该棵二叉树的前序遍历序列为q1, q2, q3, ?, qn , 中序遍历序列为z 1, z 2, z 3, ?, z n , 用数学归纳法证明由这两个序列能够唯一地确定一棵二叉树B t.1、当n= 1 时, 即前序遍历序列和中序遍历序列均只有一个元素, 且相同, 即为树的根, 由此唯一地确定了一棵二叉树2、现在假设n m - 1 时命题成立, 则需要证明当n= m 时亦成立3、当n= m 时, 前序序列为q1, q2, q3, ?, qm , 中序序列为z 1, z 2, z 3, ?, zm. 因为前序序列由前序遍历二叉树所得, 则q1必为根结点这个元素; 又中序序列由中序遍历二叉树所得, 则在中序序列中必能找到和q1相同的元素, 设为z j , 由此{z 1, z 2, ?, z j - 1} 为左子树的中序序列, {z j+ 1, z j+ 2, ?, zm } 为右子树的中序序列。再通过递归调用,找出非根节点的左右子树。由此, 从理论上证明了由一棵二叉树的前序遍历序列和中序遍历序列能够唯一确定一棵二叉树, 同理, 即由一棵二叉树的后序遍历序列和中序遍历序列, 也能够唯一地确定一棵二叉树, 但是, 由一棵二叉树的前序遍历序列和后序遍历序列, 却不能唯一地确定一棵二叉树。(3)对构造的二叉树用凹入法输出。(4) 对该二叉树进行后序遍历,输出后序遍历序列。【概要设计】用单链表存储二叉树的结点结构体定义lchilddatarchild构造二叉树对所构造的二叉树进行前序和中序遍历,并输出,并由此证明构造正确。凹入法打印二叉树。测试函数【详细设计】主要算法框架开始输入前序序列和中序序列结果调用CreatBiTree函数对构造的二叉树进行前序和中序遍历,并输出结果。将得到的结果与给出的序列进行比较相同则证明构造正确不同则构造不正确凹入法打印二叉树树结构体定义/////二叉树结构体定义typedef struct BiTNode {char data;//数据域 struct BiTNode * lchild,* rchild;//指针域 }BiTNode, * BiTree;计算结点个数int countTree (char * tree){int i;for (i = 0; tree [i] != \0;i ++);return i;}构造二叉树///////构造函数BiTree CreatBiTree (char * pre,char * in,int n){BiTree tree;char * root;int k; if (n = 0) return NULL;tree = ((BiTree) malloc (sizeof (BiTNode)));tree-data = * pre;//查找中序序列中根节点位置 for (root = in;root in + n;root ++) if (* root == * pre)break;k = root - in;tree-lchild = CreatBiTree (pre + 1,in,k); /*构造左子树*/tree-rchild = CreatBiTree (pre + 1 + k,root + 1,n - k - 1); /*构造右子树*/ return tree;}前序遍历二叉树///// 前序遍历 void pre_order(BiTree t){ if (t != NULL) { printf(%c ,t-data); pre_order(t-lchild); pre_order(t-rchild);}}中序遍历二叉树///// 中序遍历 void in_order(BiTree t){ if (t != NULL) {

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档