Codevs1029 遍历问题

本文深入探讨了如何仅通过二叉树的前序和后序遍历结果来推导其中序遍历序列的原理与步骤。文章详细解释了中序遍历序列不同的原因,以及如何通过特定算法计算可能的中序遍历序列总数。通过实例演示,读者可以直观理解并掌握这一核心概念。
摘要由CSDN通过智能技术生成

我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:

所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。

 

输入描述 Input Description

输入文件共2行,第一行表示该树的前序遍历结果,第二行表示该树的后序遍历结果。输入的字符集合为{a-z},长度不超过26。

 

输出描述 Output Description

输出文件只包含一个不超过长整型的整数,表示可能的中序遍历序列的总数。

 

样例输入 Sample Input

abc

cba

 

样例输出 Sample Output

4

 

写完代码整个人都不好了啊QAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ

首先:中序遍历之所以不同,就是因为那些只有一个儿子的节点,他的儿子可以“左偏”,也可以“右偏”(2种情况)。

其次:只有一个儿子的节点,它前序遍历中的后一个节点一定是它后序遍历的前一个节点。

所以,数出这些节点的数量c,答案就是2的c次方。

(一道区间DP就这样被非DP水过了好开心啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int main(){
 6     char ch1[30],ch2[30];
 7     cin>>ch1>>ch2;
 8     int l=strlen(ch1),c=0;
 9     for (int i=0;i<l-1;++i)
10         for (int j=l-1;j>=1;--j)
11             if (ch1[i]==ch2[j]&&ch1[i+1]==ch2[j-1])
12                 ++c;
13     long long ans=1ll<<c;
14     cout<<ans<<endl;
15 }
View Code

 

转载于:https://www.cnblogs.com/ZXTLFDeAR/p/4890847.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值