假设给出了预订和后序遍历和k。这些遍历有多少k-ary树?
k-ary树是一个有根的树,每个顶点最多只有k个孩子。
答案 0 :(得分:0)
这取决于特定的遍历对。例如
pre-order: a b c
post-order: b c a
仅描述了一个可能的树(尽可能少,除非您包含不一致的遍历对)。另一方面:
pre-order: a b c
post-order: c b a
描述了2 ^(3-1)= 4个树(在遍历有3个节点且k可以是任何东西的所有场景中最可能),即4个3节点线。
答案 1 :(得分:0)
如果您想知道具有预订和后订单遍历的可能二进制树的数量,您应该首先绘制一个可能的树。然后计算只有一个孩子的节点数。可能的树的总数将是:2 ^(单子节点的数量)
作为一个例子: pre:adbefgchij 发布:dgfebijhca
我画了一棵有3个单子节点的树。因此,可能的树的数量是8。
答案 2 :(得分:0)
首先通过 DFS 确定子树的对应范围,得到子树的数量,然后通过子树的组合来解决。
const int maxn = 30;
int C[maxn][maxn];
char pre[maxn],post[maxn];
int n,m;
void prepare()
{
memset(C,0,sizeof(C));
for(int i=0;i<maxn;i++)
{
C[i][0] = 1;
}
for(int i=1;i<maxn;i++)
{
for(int j=1;j<=i;j++)
{
C[i][j] = C[i-1][j-1] + C[i-1][j];
}
}
return;
}
int dfs(int rs,int rt,int os,int ot)
{
if(rs == rt) return 1;
int son = 0,res = 1;
int l = rs + 1,r = os;
while(l <= rt)
{
while(r < ot)
{
if(pre[l] == post[r])
{
son++;
break;
}
r++;
}
res *= dfs(l , l + r - os , os , r);
l += r - os + 1;
rs = l - 1;
os = ++r;
}
return res * C[m][son];
}
int main()
{
prepare();
while(scanf("%d",&m) && m)
{
scanf("%s %s",pre,post);
n = strlen(pre);
printf("%d\n",dfs(0,n-1,0,n-1));
}
return 0;
}