- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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的结果使用单精*高精计算出来输出即可。
您可能关注的文档
- 手术分级管理制度-南昌大学第一附属医院.doc
- 手足口病.ppt.ppt
- 手机进出口报关流程图.ppt
- 手足口病的防治对策-武汉大学医院.ppt
- 手足口防控措施指南.ppt
- 手术刀的四种标准握法.ppt
- 手术常用器械的规范操作和外科打结的方法.ppt
- 打造圆桌平台促进社区和谐——广卫街都府社区环境圆桌对话项目.ppt
- 托管代理协议-上海邮币卡.doc
- 扣件原因分析.doc
- 2024年生活照料服务类题库试题含完整答案详解(全国通用).docx
- 2024年石油石化职业技能鉴定全真模拟模拟题有答案详解.docx
- 2024年生活照料服务类题库检测试题打印.docx
- 2024年生活照料服务类题库检测试题打印附答案详解(达标题).docx
- 2024年百色职业学院传统康复治疗技术期末试题及答案详解【典优】.docx
- 2024年生活照料服务类高频难、易错点题含答案详解(综合卷).docx
- 2024年生活照料服务类通关考试题库附答案详解(A卷).docx
- 2024年石油石化职业技能鉴定考前冲刺测试卷及参考答案详解【名师推荐】.docx
- 2024年石油石化职业技能鉴定综合提升测试卷一套附答案详解.docx
- 2024年石油石化职业技能鉴定练习题附完整答案详解(网校专用).docx
文档评论(0)