TOJ二叉树的遍历

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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值