1010 : 二叉树的遍历
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
描述
对于一棵二叉树,有三种遍历。
如果给出前序遍历和中序遍历,那么后序遍历是唯一确定的。
但是如果只知道前序遍历和后序遍历,那么中序遍历是不确定的。
例如前序遍历是ABCD,后序遍历是CBDA,那么中序遍历可以是 CBAD 或者 BCAD
现在的问题是给出前序遍历和后序遍历,要求出中序遍历有多少种不同的方案。
输入
输入数据有多组,第一行为数据组数T,每组数据有两行,第一行是前序遍历,第二行是后序遍历,结点用大写字母表示,结点个数不超过15个。
输出
每组输出一行,为方案总数。
样例输入
1
ABCD
CBDA样例输出
2
思路:对于一个二叉树,若某个根节点只有一个子树,则先序和后序确定的情况下这个树有两种情况。
中序是用来确定子树位置的。
树有多种情况如先序为AB 后序为BA 则这个b节点可能为左儿子也可能为右儿子。
故这一题
只需找到只有一个子节点的根节点的个数即可
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n; cin >> n;
while (n--)
{
string a, b;
cin >>a>>b;
int n = a.size();
int as = 1;
for (int i = 0; i < n;)
{
int j;
for (j= 0; j < n; j++)
if (b[j] == a[i])break;//找到一个先序与后序相等的点
//从根节点开始遍历
while (1)
{
i++; j--;
//后序往回找,先序往后深处找,
if (i >= n || j < 0)break;//因为后序若有俩儿子支点则不会与先序往后遍历相等
if (b[j] == a[i])as *= 2;//出现只有一个子节点则*2
else break;
}
}
cout << as << endl;
}
return 0;
}