PKU1240 Pre-Post-erous! 基于树的遍历概念的题目

题意:
给出一棵K叉树的前序和后序遍历,问中序遍历有多少种

解法:
之所以中序遍历会有多种,原因是存在不满儿子的节点,导致树的形态有不同
通过前序和后序遍历,可以将每一棵子树划分出来,然后递归的累乘计算个数(乘法原理),最后再乘以Ckn,n为当前节点的子树个数

代码:
 1# include <cstdio>
 2using namespace std;
 3# include <cstdlib>
 4# include <cstring>
 5char pre[50],post[50];
 6int c[21][21],k;
 7int solve(int s1,int s2,int l)
 8{
 9    int ans=1,co=0,last;
10    for(int i=s1+1;i<s1+l;i+=s2-last)
11    {
12       last=s2;
13       co++;
14       for(;post[s2]!=pre[i];s2++);
15       ans*=solve(i,last,++s2-last);
16    }

17    return ans*c[k][co];
18}

19int main()
20{
21    memset(c,0,sizeof(c));
22    for(int i=0;i<=20;i++) c[i][0]=c[i][i]=1;
23    for(int i=1;i<=20;i++)
24      for(int j=1;j<i;j++)
25        c[i][j]=c[i-1][j-1]+c[i-1][j];
26    while(scanf("%d%s%s",&k,pre,post)==3)
27       printf("%d\n",solve(0,0,strlen(pre)));
28    return 0;
29}

30

posted on 2011-01-08 18:50 yzhw 阅读(345) 评论(0)  编辑 收藏 引用 所属分类: data struct


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜