51nod 1832 先序遍历与后序遍历
来源:互联网 发布:2016知乎日报启动照片 编辑:程序博客网 时间:2024/06/14 10:15
标程:
考虑一个有两个儿子的节点X,令X的左儿子为L,右儿子为R
则X子树的先序遍历和后序遍历类似下图
先序遍历 X L … R …
后序遍历 … L … R X
可以发现我们可以轻松地找出两个儿子从而确定树的形态。
只有一个儿子的话这个儿子既可以是左儿子也可以是右儿子。
只需要统计有一个儿子的节点数量即可。
要用大整数
我是看的一篇文章讲到了类似的问题
由先序和后序遍历求解符合条件的n叉树个数的方法及程序实现:https://wenku.baidu.com/view/a2a45aa0284ac850ad024261.html
#include <bits/stdc++.h>using namespace std;struct BigInt{ const static int mod = 10000; const static int DLEN = 4; int a[600],len; BigInt() { memset(a,0,sizeof(a)); len = 1; } BigInt(int v) { memset(a,0,sizeof(a)); len = 0; do { a[len++] = v%mod; v /= mod; } while(v); } BigInt operator *(const BigInt &b)const { BigInt res; for(int i = 0; i < len; i++) { int up = 0; for(int j = 0; j < b.len; j++) { int temp = a[i]*b.a[j] + res.a[i+j] + up; res.a[i+j] = temp%mod; up = temp/mod; } if(up != 0) res.a[i + b.len] = up; } res.len = len + b.len; while(res.a[res.len - 1] == 0 &&res.len > 1)res.len--; return res; } void output() { printf("%d",a[len-1]); for(int i = len-2; i >=0 ; i--) printf("%04d",a[i]); printf("\n"); }};const int MAXN = 10010;int a[MAXN];int b[MAXN];int n;BigInt res(1);int sf(int l, int r, int num){ for(int i = l; i < r; ++i) if(b[i] == num) return i; return -1;}int calc(int num){ if(num == 1) return 2; if(num == 2 || num == 0) return 1; return 0;}void dfs(int al, int ar, int bl, int br){ int len = ar-al; if(len == 1) return; al++; br--; int ccc = 0; int cnt = ar-al; while(cnt != 0) { int index = sf(bl,br,a[al]); int newar = al+(index-bl+1); int newbr = index+1; ++ccc; dfs(al,newar,bl,newbr); cnt -= (index-bl+1); al = newar; bl = index+1; } res = res*BigInt(calc(ccc));}void solve(){ dfs(0,n,0,n);}int main(){ scanf("%d",&n); for(int i = 0; i < n; ++i) scanf("%d",&a[i]); for(int i = 0; i < n; ++i) scanf("%d",&b[i]); solve(); res.output(); return 0;}
阅读全文
0 0
- 51nod 1832 先序遍历与后序遍历
- 51Nod-1832-先序遍历与后序遍历
- 51nod 1832 先序遍历与后序遍历(DFS)
- 51nod 1832 先序遍历与后序遍历(树的遍历方法+高精度模板)
- 51 nod 算法马拉松28 先序遍历与后序遍历
- 算法马拉松28 先序遍历与后序遍历
- 先序遍历 中序遍历 后序遍历
- 树遍历方式总结:层次遍历、先序遍历、中序遍历、后序遍历
- 先序,中序,后序遍历
- 先序,中序,后序遍历
- 先序遍历/后序遍历创建线索二叉树
- 算法马拉松28 先序遍历与后序遍历(递归/高精度)
- 二叉树的先序遍历,后序遍历,中序遍历,层次遍历
- 二叉树的遍历(1)--先序遍历,中序遍历,后序遍历
- 二叉树 非递归 先序遍历 中序遍历 后序遍历 层次遍历
- hihocoder #1049 : 后序遍历 (已知先序遍历和中序遍历求后序遍历)
- 递归法遍历二叉树 (先序遍历 中序遍历 后序遍历)
- 树的遍历—先序遍历、中序遍历、后序遍历
- 可持续化Trie_区间异或最大_bzoj3261
- STM32L152 USART
- Android命令行启动debug
- 【学习笔记】nginx web部署进阶
- HDU 1205 吃糖果
- 51nod 1832 先序遍历与后序遍历
- HttpServletResponse对象(一)
- java8 Stream API笔记
- 智能电视盒子芯片哪个更强?七大芯片方案性能详解
- 博客准备要再次开始写了
- opencv中waitKey()的作用
- 安装Tensorflow1.3版本出错解决
- 排序算法---ALL的总结
- vue.js样式切换小技巧