题目链接

问题描述 :

We are all familiar with pre-order, in-order and post-order traversals of binary trees. A common problem in data structure classes is to find the pre-order traversal of a binary tree when given the in-order and post-order traversals. Alternatively, you can find the post-order traversal when given the in-order and pre-order. However, in general you cannot determine the in-order traversal of a tree when given its pre-order and post-order traversals. Consider the four binary trees below:

All of these trees have the same pre-order and post-order traversals. This phenomenon is not restricted to binary trees, but holds for general m-ary trees as well.

输入:

Input will consist of multiple problem instances. Each instance will consist of a line of the formm s1 s2indicating that the trees are m-ary trees, s1 is the pre-order traversal and s2 is the post-order traversal.All traversal strings will consist of lowercase alphabetic characters. For all input instances, 1 <= m <= 20 and the length of s1 and s2 will be between 1 and 26 inclusive. If the length of s1 is k (which is the same as the length of s2, of course), the first k letters of the alphabet will be used in the strings. An input line of 0 will terminate the input.

输出:

For each problem instance, you should output one line containing the number of possible trees which would result in the pre-order and post-order traversals for the instance. All output values will be within the range of a 32-bit signed integer. For each problem instance, you are guaranteed that there is at least one tree with the given pre-order and post-order traversals.

样例输入:

2 abc cba

2 abc bca

10 abc bca

13 abejkcfghid jkebfghicda0

样例输出:

4

1

45

207352860

题意:

一般来说我们可以根据一棵树的中序遍历序列和后序序列(前序序列)来唯一的确定一个树的结构,但是没有办法通过一个树的前序序列和后序序列来确定这棵树。因为这样的树可能有很多种不同的形态,现在给定一棵树是n次树,以及这棵树的前序和后序序列,要求计算出这样的树有多少中可能。

分析:

首先对于m叉树的前序遍历序列,第一个字符一定表示这颗m叉树的根,在后序遍历序列中最后一个字符表示m叉树的根.前序遍历序列中的第二个字符x1,一定是m叉树根节点的第一棵子树的根节点,那么在后序遍历序列中,从开始部分到x1的部分一定是m叉树的第一颗子树的后序遍历序列,假设,这部分的个数为n1,那么在前序遍历序列中,从x1开始后的n1个字符一定是m叉树的第一颗子树的前序遍历序列.则在前序遍历序列中截掉这n1个字符以及代表根的字符后,在剩下的序列中,第一个字符x2一定是m叉树的第二棵子树的根节点.在后序遍历序列剩余的部分中,从头到x2的部分即是这第二颗子树的后序遍历序列,设节点个数为n2.那么在前序遍历序列中,从x2开始的n2个字符一定是这m叉树第二颗子树的前序遍历序列.以此类推,对于每棵树的前序和后序遍历序列,可以确定根节点的子节点是哪些,并且能够得到分别以这些子节点为根节点的子树的前序和后序遍历序列,如此的递归下去,可以知道这m叉树的层次结构和节点之间的父子关系以及兄弟节点之间的顺序关系.

  节点之间的关系确定之后,需要确定一共有多少这样的m叉树.首先对于二叉树的情况,当一个根节点只有一个子节点时,这个儿子节点位于左二子或者右儿子的位置都会使得整个二叉树不同.那么类比到m叉树,如果m叉树某一个根节点只有n个子节点,那么这n个节点分别属于哪个树杈都会使得整个树的形状不一样.由于这n个节点的顺序是确定的,相当于把n个点顺序的放到m个位置,则有C(m , n)中放法.对于整棵树来说,树的种数等于每个节点的子节点位置的种数的乘积.

例如:

13 abejkcfghid jkebfghicda

'a'是这13叉树的根节点,在前序遍历序列中'b'为这13叉树根节点'a'的第一颗子树的根,则在后序遍历序列中从'j'到'b'则为这第一棵子树的后序遍历序列,经计算共有四个节点,那么在前序遍历序列中,从'b'到'k'的这四个字符一定是第一颗子树的前序遍历序列.前序遍历序列中'k'后面的第一个字符'c',一定是这颗13叉树根节点'a'的第二颗子树的根,则在后序遍历序列中从'f'到'c'的五个字符一定是第二棵子树的后序遍历序列,那么在前序遍历序列中,从'c'往后再截取五个字符到'i',则说明这部分为第二棵子树的前序遍历序列.'i'之后的第一个字符'd'则为根节点'a'的第三棵子树的根节点,同样在后序遍历序列中'd'则为第三棵子树的后序遍历序列,在这里则说明第三棵子树只有一个根节点'd'.然后分别对第一颗子树和第二课子树前序以及后序遍历序列进行递归,从而得到子树根节点的子节点的个数以及顺序.由于根节点'a'有'b','c','d'这三个子节点,那么对于13叉树来说要把这三个节点顺序的放到13个位置则为C(13, 3).对于'a'的子节点'b'来说很明显仅有一个子节点'e',所以同样有C(13, 1)种放法,对于'e'节点则有两个子节点'j'和'k',那么种类为C(13, 2).对于'a'的第二个子节点'c'来说有4个子节点'f','g','h'及'i',那么总放法为C(13, 4),所以总的种数位C(13, 3) * C(13, 1) *C(13, 2) * C(13, 4) = 207352860.

代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
typedef long long LL;
using namespace std;
int n;
LL ans;
char pre[30],epi[30]; LL calculate(LL n, LL m) //计算组合数,一共有n个位置可以放,但是只放了m个位置
{
if(m < n - m) m = n - m;
LL ans = 1;
for(LL i = m + 1; i <= n; i++) ans *= i;
for(LL i = 1; i <= n - m; i++) ans /= i;
return ans;
}
void research(int preLeft,int preRight,int epiLeft,int epiRight)
{
int i,cnt=0,root=preLeft+1;//root表示的是以pre[preLeft]为根节点的直接孩子节点的下标
while(root<=preRight)
{
for(i=epiLeft;i<=epiRight;i++)//在后序序列中找到当前的根节点的位置,
{
if(epi[i]==pre[root])
break;
}
int Size=i-epiLeft+1;//Size为以root为根节点的整个子树的大小
research(root,root+Size-1,epiLeft,i);//递归这往下寻找这棵子树
//pre[root~ (root + Size - 1)] 为以pre[root]为根节点的子树的前序遍历序列, epi[epiLeft~i]则为其的后序遍历序列 cnt++;//最起始的根节点的子树个数加
root+=Size;//再次递归最起始节点的下一个子树
epiLeft=i+1;////截掉后序遍历序列中epiLeft ~ i 的部分
}
ans*=calculate((LL)n,LL(cnt));//累乘计算答案数
} void solve()
{
int len=strlen(pre);
research(0,len-1,0,len-1);//当前的线序和后续的区间
printf("%lld\n",ans);
}
int main()
{
while(~scanf("%d",&n)&&n)
{
memset(pre,0,sizeof(pre));
memset(epi,0,sizeof(epi));
scanf("%s %s",pre,epi);
ans=1;
solve();
}
return 0;
}

POJ 1240 Pre-Post-erous! && East Central North America 2002 (由前序后序遍历序列推出M叉树的种类)的更多相关文章

  1. POJ 1240 Pre-Post-erous! && East Central North America 2002 (由前序后序遍历序列推出M叉树的种类)

    题目链接:http://poj.org/problem?id=1240 本文链接:http://www.cnblogs.com/Ash-ly/p/5482520.html 题意: 通过一棵二叉树的中序 ...

  2. MPI Maelstrom(East Central North America 1996)(poj1502)

    MPI Maelstrom 总时间限制:  1000ms 内存限制:  65536kB 描述 BIT has recently taken delivery of their new supercom ...

  3. poj 2732 Countdown(East Central North America 2005)

    题意:建一个家庭树,找出有第d代子孙的名字,按照要求的第d代子孙的数从大到小输出三个人名,如果有一样大小子孙数的,就按字母序从小到大将同等大小的都输出,如果小于三个人的就全输出. 题目链接:http: ...

  4. Gym-101673 :East Central North America Regional Contest (ECNA 2017)(寒假自训第8场)

    A .Abstract Art 题意:求多个多边形的面积并. 思路:模板题. #include<bits/stdc++.h> using namespace std; typedef lo ...

  5. 2017-2018 ACM-ICPC East Central North America Regional Contest (ECNA 2017) Solution

    A:Abstract Art 题意:给出n个多边形,求n个多边形分别的面积和,以及面积并 思路:模板 #include <bits/stdc++.h> using namespace st ...

  6. East Central North America Region 2015

    E 每过一秒,当前点会把它的值传递给所有相邻点,问t时刻该图的值 #include <iostream> #include <cstdio> #include <algo ...

  7. 2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) F 区间dp

    Problem F Removal GameBobby Roberts is totally bored in his algorithms class, so he’s developed a li ...

  8. 2014-2015 ACM-ICPC East Central North America Regional Contest (ECNA 2014) A、Continued Fractions 【模拟连分数】

    任意门:http://codeforces.com/gym/100641/attachments Con + tin/(ued + Frac/tions) Time Limit: 3000/1000 ...

  9. East Central North America 2006 Hie with the Pie /// 状压dp oj22470

    题目大意: 输入n,有n个地方(1~n)需要送pizza pizza点为0点 接下来n+1行每行n+1个值 表示 i 到 j 的路径长度 输出从0点到各点送pizza最后回到0点的最短路(点可重复走) ...

随机推荐

  1. Dubbo学习(四) dubbo的特点,8种通信协议之对比

    一.dubbo的特性 (1) 连通性: 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小 监控中心负责统计各服务调用次数,调用 ...

  2. 第211天:git和github的区别和使用详解

    一.git 1.什么是git 它是一个源代码管理工具,在一个项目中,凡是由开发人员编写的都算是源代码,源代码有必要管理起来,让源代码可以被追溯,主要记录每次变更了什么,谁主导这次变化.人为的维护比较麻 ...

  3. Eclipse中设置作者、日期等的方式

    1.点击Windows->Preferences->Java->Code Style->Code Templates: 2.点击展开右侧的Comments选项卡,里面的选项对应 ...

  4. P4417 [COCI2006-2007#2] STOL

    题目描述 米尔科买了一套别墅,他想要邀请尽量多的人和他一起庆祝.他需要一张大的木质矩形桌子来让他和他的嘉宾坐下.每张桌子可容纳的人数等于它的周长(四边长度的总和).米尔科想要买一张即可在他的公寓里放下 ...

  5. ibatis解决sql注入问题

    原文: http://blog.csdn.net/scorpio3k/article/details/7610973 对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转义 ...

  6. 【题解】JSOI2015染色问题

    好像这个容斥还是明显的.一共有三个要求,可以用组合数先满足一个,再用容斥解决剩下的两个维.(反正这题数据范围这么小,随便乱搞都可以).用 \(a[k][i]\) 表示使用 \(k\) 种颜色,至少有 ...

  7. NetApp存储方案及巡检命令

    一.MCC概述 Clustered Metro Cluster(简称MCC)是Netapp Data Ontap提供的存储双活解决方案,当初的方案是把1个FAS/ V系列双控在数据中心之间拉远形成异地 ...

  8. 2017 3 11 分治FFT

    考试一道题的递推式为$$f[i]=\sum_{j=1}^{i} j^k \times (i-1)! \times \frac{f[i-j]}{(i-j)!}$$这显然是一个卷积的形式,但$f$需要由自 ...

  9. 北京联通IPTV 数码视讯 Q1 破解过程

    1. 买个usb转ttl的线,我买的是ch340g,3.8元包邮,店家貌似叫telesky,不重要,买到这货就行,里面有送杜邦线 2. 电脑上安装ch340g驱动,注意不要安装错了,注意电压的设置保持 ...

  10. struts的问题

    将SSH框架进行整合的时候,将三者的jar包加入到lib下面,然后测试struts,结果页面显示不出来报404错误,可是路径没有问题 找到罪魁祸首是:原因两个:(1)在未用到spring的时候,先不要 ...