首页 > 试题广场 >

我们都了解二叉树的先根遍历,中根遍历和后根遍历。当知道先根

[填空题]
 我们都了解二叉树的先根遍历,中根遍历和后根遍历。当知道先根遍历的结果和中根遍历结果的时候,
我们可以唯一的确定二叉树;同样的,如果知道了后根遍历的结果和中根遍历结果,二叉树也是唯一确定
的。但是如果只知道先根遍历和后根遍历的结果,二叉树就不是唯一的了。但是我们可以计算满足条件的
不同二叉树的一共有多少个。这不是一个很困难的问题,稍微复杂一点,我们把这个问题推广到 N 叉树。

我们用小写英文字母来表示 N 叉树的结点,不同的结点用不同的字母表示。比如,对于 4 叉树,如果
先根遍历的结果是 abdefgc,后根遍历的结果是 defgbca,那么我们可以得到 6 个不同的 4 叉树

输入:
输入数据包括 3 行。
第一行是一个正整数 N(1 ≤ N ≤ 20),表示我们要考虑 N 叉树。
第二行和第三行分别是两个字符串序列,分别表示先根遍历和后根遍历的结果。
输出:
输出不同的 N 叉树的数目。题目中给的数据保证得到的结果小于 231。
输入样例:
4
abdefgc
defgbca
输出样例:
6
程序:
#include <bits/stdc++.h>
char str1[100], str2[100];       
int N;       
long com[100][100];       
long getcom(int x, int y) {        
    if (y == 0 || x == y)   1  ;        
    else if (com[x][y] != 0) return com[x][y];        
    else { 
        com[x][y] = getcom(x - 1, y)+   2  ;         
        return com[x][y]; 
       }  
} 
long count(int a, int b, int c){        
    long sum = 1;        
    int k = 0;        
    int s = a + 1, t = c, p; 
       if (a == b) return 1;        
       while(s <= b){         
           p = t;         
           while(str1[s] != str2[t]) t++;         
           sum = sum * count(s, s + t - p, p);         
           s =   3  ;          
           4  ;         
           k++;       
        }        
        return   5   * getcom(N, k);  
}       
int main( ){        
    int len;        
    scanf("%d", &N);        
    scanf("%s%s", str1, str2);        
    len = strlen(str1);        
    printf("%ld\n", count(  6  ));        
    return 0; 
}

这道题你会答吗?花几分钟告诉大家答案吧!