Poj Pre-Post-erous!
来源:互联网 发布:js字符串叠加 编辑:程序博客网 时间:2024/05/18 01:05
题目链接:http://dsalgo.openjudge.cn/tree/1/
我们知道只通过前序和后序遍历的结果是不能确定一棵树(此处的树的定义对于孩子的相互位置关系有要求)的,因为如果一m叉棵树的某一个节点孩子个数为n,其孩子的排列在满足前后顺序的前提下有C(m,n)(组合数)种情况。
所以采用递归的方式分别计算每一棵孩子树的可能数,根据乘法原理相乘,在乘上在该层的可能数,即可得到一棵子树的可能数。
代码如下:
#include <cstdio>#include <cstring>const int MAXM = 20;int Comb[MAXM+1][MAXM+1];//打表计算组合数void calComb(){ Comb[0][0] = 1; for(int i = 1; i <= MAXM; ++i) { Comb[i][0] = 1; Comb[i][i] = 1; for(int j = 1; j < i; ++j) { Comb[i][j] = Comb[i-1][j-1] + Comb[i-1][j]; } }}int solve(int m, char *preSta, char *postSta, int len){ int ret = 1; int son = 0; int i = 1, j = 0; while(i < len) { while(preSta[i] != postSta[j]) { ++j;//寻找子树 } ++son; ret *= solve(m, preSta+i, postSta+i-1, j+2-i); i = j+2;//注意后序遍历的下标与该子树的结点个数的关系,以及前序遍历子树节点数。 } ret *= Comb[m][son]; return ret;}int main(){ calComb(); int m; char pre[27], post[27]; while(scanf("%d", &m) && m != 0) { scanf("%s", pre); scanf("%s", post); printf("%d\n", solve(m, pre, post, strlen(pre))); } return 0;}
阅读全文
0 0
- Poj Pre-Post-erous!
- POJ 1240 Pre Post erous
- poj 1240 Pre-Post-erous!
- poj 1240——Pre-Post-erous!
- poj 1240 Pre-Post-erous! 分治
- POJ 1240 Pre-Post-erous! 笔记
- poj1240 Pre-Post-erous!
- poj1240 Pre-Post-erous!
- Pre-Post-erous!
- POJ 1240 Pre-Post-erous!(组合数学+递归)
- poj 1240 Pre-Post-erous!(递归+组合计数)
- zoj 1500 Pre-Post-erous!
- zoj 1500 Pre-Post-erous!
- 【ZOJ 1500】 Pre-Post-erous!
- POJ1240 Pre-Post-erous! 【待完成】
- POJ 1240 Pre-Post-erous! 前序+后序遍历判断树的形状的数量
- POJ 1240 Pre-Post-erous! 由前序后续遍历顺序推m-叉树的个数
- poj1240Pre-Post-erous!
- mysql数据库开启innodb储存引擎方法
- 第十四周 项目三 B_树的基本操作
- 梯度下降算法
- 项目需求
- stopPropagation&&preventDefault
- Poj Pre-Post-erous!
- jquery实现全选反选操作
- EOJ Monthly 2017.12 易位构词(贪心+STL特性容器 +头文件<bits/stdc++.h> )
- 省选专练SHTSC2002舞会
- 关于String.intern()
- (七)Selenium库
- 关于PHP上传文件和中文名乱码情况
- 学习owl
- 不负韶华