- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
pascal中级教程第二章递归和递推
第二章 递归与递推
2.1 遍历问题
源程序名 travel.???(pas, c, cpp)
可执行文件名 travel.exe
输入文件名 travel.in
输出文件名 travel.out
【问题描述】
我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:
a a a a
/ / \ \
b b b b
/ \ / \
c c c c
所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
【输入】
输A数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。
【输出】
输出可能的中序遍历序列的总数,结果不超过长整型数。
【样例】
trave1.in trave1.out
abc 4
bca
【算法分析】
根据二叉树先序遍历和后序遍历的特点,可以知道,先序遍历的第一个结点是后序遍历的最后一个结点,对于中序遍历来说却是中间的一个结点,这里所说的中间也只是相对而言的中间。如果一棵二叉树的根结点没有左子树,那么先序遍历的第一个结点也是中序遍历的第一个结点,如果一棵二叉树的根结点没有右子树,那么先序遍历的第一个结点是中序遍历的最后一个结点。我们这里还认为就是中序遍历的中间结点,上面两种情况只是特殊的情况。
设二叉树的结点总数为n(对于输入的字符串来说是它的长度),对于先序遍历的结果,第一个结点为根结点,从第二个结点到最后一个结点分为n种情况:
根结点的左子树结点个数为n-1,右子树结点的个数为0;
根结点的左子树结点个数为n-2,右子树结点的个数为1;
……
根结点的左子树结点个数为n-i,右子树结点的个数为i-1;{0=i=n-1);
……
根结点的左子树结点个数为0,右子树结点的个数为n-1。
根据这n种情况,分别将二叉树拆分为左子树和右子树,左子树结点个数为n-i,右子树结点的个数为i-l(0=i=n-1),先序遍历的结果是从第二个结点(字符)开始取,而后序遍历的结果里是从第1个结点字符开始取。也就是说对于每一种情况,分两步处理:第一步在先序遍历和后序遍历的结果里取左子树,看是否符合规则,统计这部分可能有的中序遍历的结果数目;第二步在先序遍历和后序遍历的结果里取右子树,看是否符合规则,统计这部分可能有的中序遍历的结果数目。这两步都递归调用了统计过程,不再递归调用的条件就是当统计的是空树或只有一个结点的树,这时返回的值是可能有的中序遍历结果数目。
结合“分类相加原理”和“分步相乘原理”,可以得到下面的递归函数:
Function count (先序结果first,后序结果last : string) : longint;
begin
Len:=遍历结果的长度;
如果len为0或1,则返回结果即count:=l
否则 begin
t为当前统计后符合条件的数目,初值为0;
分类统计for i:=len-1 downto 0 do
begin
在first中取出长度为i的左子树结果LF;
在last中取出长度为i的左子树结果LL;
在first中取出长度为len-1-i的左子树结果RF;
在last中取出长度为len-1-i的右子树结果RL;
如果LF、LL符合基本规则(LF的首字符跟LL的尾字符相同、LF中,所有的
字符在LL中也都有)
并且RF、RL也符合基本规则,那么
t:=t+count(LF,LL)*count(RF,RL);
{分步相乘、分步相加}
{这里count函数中递归调用了count}
end;
返
文档评论(0)