改进后的主程序伪代码.ppt

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
改进后的主程序伪代码

北京赛区 B ——李昕 题目描述 已知树的先序和后序遍历,求符合要求的树的个数。 Sample Input 1 2 3 3 2 1 Output 4 思考 由此得到主程序伪代码(I) int counttree(t : tree) { tree zuo, you; int i, j; if (t为空) return 0; zuo = t的左子树 you = t的右子树 i = counttree(zuo); j = counttree(you); if (i = 0) return 1; if (j = 0) return(i * 2); return(i * j); } 问题出现了。。。 观察题目给出的数据范围,我们发现树的节点个数巨大无比。单精度无法存储。需要使用高精度。 看到语句“return(i * j);”是高精乘高精。 同时,每次递归压栈都要压一个几千的数组。程序的递归层数可能达到一千。空间只怕会崩溃。 发现!~~~ 注意到程序中涉及到需要计算的具体数字只有1,2。猜想 ,最后结果和所有中间结果都是2的幂。 简单证明: 1、只有一个节点时,为1=2^0 2、同时可以为左子树和右子树时,若本身有2^m中可能,则为(2^m)*2=2^(m+1) 3、右子树左子树分别有2^m,2^n中可能,则为(2^m)*(2^n)=2^(m+n) 得证。 改进后的主程序伪代码(II) int count_tree(t : tree) { tree zuo, you; int i, j; if (t为空) return -1; zuo = t的左子树; you = t的右子树; i = count_tree(zuo); j = count_tree(you); if (i = -1) return 0; if (j = -1) return(i + 1); return(i + j); } 没有了。。。。 谢谢。。。 * * 1 2 3 1 2 3 1 2 3 1 2 3 根 左1 右1 根 右2 左2 当右子串为空时,标为“左”的子串既可以为根的左子树,也可以为根的右子树。 而左1,2子串和右子串1,2又分别是左子树和右子树的先序后序遍历。 于是可以递归求解: 1、已知符合要求的左子树和右子树个数分别为a, b 2、那么当右串不为空时,整棵树符合要求的个数为a*b;为空时,整棵树符合要求的个数为a*2 最后再把得到的count_tree的结果使用单精*高精计算出来输出即可。

文档评论(0)

daoqqzhuan2 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档