NEUQ 1022:二叉树

链接: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;
}

猜你喜欢

转载自blog.csdn.net/jtjljy/article/details/80245802
今日推荐