链接:http://newoj.acmclub.cn/problems/1022
题目:
1022: 二叉树
描述
题目描述:
众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次。最常使用的有三种遍历的方式:
1.前序遍历:若二叉树为空,则空操作;否则先访问根结点,接着前序遍历左子树,最后再前序遍历右子树。
2.中序遍历:若二叉树为空,则空操作;否则先中序遍历左子树,接着访问根结点,最后再前中遍历右子树。
3.后序遍历:若二叉树为空,则空操作;否则先后序遍历左子树,接着后序遍历右子树,最后再访问根结点。
现在的问题是给定前序遍历和后序遍历的顺序,要求出总共有多少棵不同形态的二叉树满足这样的遍历顺序。
输入:
输入有多组数据,每组数据两行,第一行给出前序遍历的访问顺序,第二行给出后序遍历的访问顺序。
二叉树的结点用一个大写字母表示,不会有两个结点标上相同字母。输入数据不包含空格,且保证至少有一棵二叉树符合要求。
输出:
输出一个整数,为符合要求的不同形态二叉树的数目。
样例输入
ABCD
CBDA
样例输出
2
解题的秘钥:在前后序中,导致二叉树不确定性的一个关键因素就是存在着单子树,也就是只存在一颗子树,这个子树又存在左右之分,所以一种这种情况就可出现2种情况,那么在数里面出现n种情况,那就是pow(2,n)种了。
代码:
#include <bits/stdc++.h>
using namespace std;
int times;
int main()
{
string frontline,backline;
while(cin>>frontline>>backline)
{
times=0;
int linelength=frontline.length();
for(int i=0;i<linelength;++i)
{
for(int j=linelength-1;j>0;--j)
{
if(frontline[i]==backline[j] && frontline[i+1]== backline[j-1]) ++times;
}
}
cout<<(int)pow(2,times)<<endl;
}
return 0;
}