树(BFS),紫书P155UVa548
来源:互联网 发布:最好的英文翻译软件 编辑:程序博客网 时间:2024/05/18 15:56
本题也是非常经典的利用二叉树中序和先序(或者后续)遍历的数据,还原成原始二叉树的结构。由于本题的节点权值题目中规定不重复,顾刘采用了数组来存储二叉树。这在上一道题树的层序遍历中是行不通的,在节点权值重复的情况下用数组模拟二叉树,只能按照完全二叉树的方式来模拟,数据量太大的情况下数组是开不下的。
本题二叉树生成和遍历都是基于数组的操作,可以把本题当做一个数组二叉树的模板吧。
build函数与dfs函数是本题目的核心。要反复复习思考。
// UVa548 Tree// Rujia Liu#include<iostream>#include<string>#include<sstream>#include<algorithm>using namespace std;const int maxv = 10000 + 10;int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];int n;bool read_list(int* a) { string line; if(!getline(cin, line)) return false; stringstream ss(line); n = 0; int x; while(ss >> x) a[n++] = x; return n > 0;}int build(int L1, int R1, int L2, int R2) { if(L1 > R1) return 0; int root = post_order[R2]; int p = L1; while(in_order[p] != root) p++; int cnt = p-L1; lch[root] = build(L1, p-1, L2, L2+cnt-1); rch[root] = build(p+1, R1, L2+cnt, R2-1); return root;}int best, best_sum; void dfs(int u, int sum) { sum += u; if(!lch[u] && !rch[u]) { if(sum < best_sum || (sum == best_sum && u < best)) { best = u; best_sum = sum; } } if(lch[u]) dfs(lch[u], sum); if(rch[u]) dfs(rch[u], sum);}int main() { while(read_list(in_order)) { read_list(post_order); build(0, n-1, 0, n-1); best_sum = 1000000000; dfs(post_order[n-1], 0); cout << best << "\n"; } return 0;}
阅读全文
0 0
- 树(BFS),紫书P155UVa548
- hdu1254(bfs+bfs)
- POJ 1985 Cow Marathon(树的直径&BFS+BFS)
- poj 3026(BFS+最小生成树)
- 求树层数&深搜BFS(模板)
- POJ 1451 T9(字典树+bfs)
- POJ 3026(BFS+最小生成树)
- 从上到下打印二叉树(BFS)
- POJ 3414 bfs求路径(建bfs树然后树上寻找路径)
- hdu1254(嵌套bfs,两次bfs)
- hdu 1254 推箱子(bfs + bfs)
- hdu1254 推箱子(bfs+bfs)
- BFS:HDU3085-Nightmare Ⅱ(双向BFS)
- UVA816 紫书bfs
- BFS树&DFS树
- 树的BFS
- 数据结构 BFS遍历树
- uva10410(树还原BFS)
- 经典排序算法练习
- java集合树状结构及源码
- Ubuntu 16.04下安装Tomcat 8.5.9
- 点云obj格式转换成pcd格式
- 为移动设备设计和证明一个符合EMV协议的支付协议一
- 树(BFS),紫书P155UVa548
- [bzoj5018][dp]英雄联盟
- ssh框架 spring IOC注解的方式
- C++输入cin详解
- 使用MySQL Workbench建立数据库,建立新的表,向表中添加数据
- 训练集--训练赛8
- Ubuntu 16.04配置JDK1.8.0_144教程
- android Spannable
- 喝茶让你降三高之“桑玉茶”