UVA_548Tree
这是一个很经典的建树,然而当时不会!!!!
给你一个中序和后序 先建一个二叉树,然后找最优解(最优解就是一个叶子节点到根节点权值最小, 同时本身权值最小)
//生成一棵树
- int build(int L1, int R1, int L2, int R2) { //表示1为中序,2为后序 生成这个二叉树 其中R2为这棵树的根
- if(L1 > R1) return 0;
- int root = post_order[R2];
- int p = L1;
- while(in_order[p] != root) ++p; //在中序中找到根的位置
- int cnt = p - L1; //cnt表示当前这棵树左子树的大小
- lch[root] = build(L1, p-1, L2, L2 + cnt -1);//这里要知道在后序中,左子树(cnt),右子树,根
- 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);
- }
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<string>
- #include<queue>
- #include<cstdlib>
- #include<algorithm>
- #include<stack>
- #include<map>
- #include<queue>
- #include<vector>
- #include<sstream>
- using namespace std;
- const int maxn = 1e4+100;
- int in_order[maxn], post_order[maxn], lch[maxn], rch[maxn];
- 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(){
- #ifdef LOCAL
- freopen("in.txt","r",stdin);
- // freopen("out.txt","w",stdout);
- #endif
- 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;
- }
UVA_548Tree的更多相关文章
随机推荐
- 【C#学习笔记】 List.AddRange 方法
[官方笔记] 将指定集合的元素添加到 List 的末尾 命名空间:System.Collections.Generic程序集:mscorlib(在 mscorlib.dll 中) public: vo ...
- PAT 2019-3 7-3 Telefraud Detection
Description: Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, ...
- VLAN基础配置及Access接口 实验1
1.Access接口 是交换机上与PC机上相连的端口 2.当主机向交换机发送数据帧时,经过的Access口会将该帧加一个与自己PVID一致的VLAN标签 当交换机的Access口要发送给PC机一个带有 ...
- 实验报告(七)&第九周课程总结
班级 计科二班 学号 20188425 姓名 IM 完成时间2019/10/24 评分等级 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: ...
- Python 学习笔记12 函数模块
函数的优点之一,使用它们可将代码块与主程序分离.通过给函数指定描述性的名称.可以让主程序非常好理解.但是如果将过多的函数和主程序放置在一起,会让文件显得非常凌乱.太多的代码混杂在一起,不方便管理.我们 ...
- java反射(三)--反射与操作类
一.反射与操作类 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成的操作,任何一个类的基本组成结构:父类(父接口),包,属性,方法(构造方法,普通方法)--获取类的 ...
- javaIO流(二)--字节流与字符流
一.流的基本概念 在java.io包中,File类是唯一一个与文件本身有关的程序处理类,但是File类只能操作文件本身,而不能操作文件内容,IO操作的核心意义在于输入和输出操作.而对于程序而言,输入和 ...
- 【目录】Identityserver 4 老张的哲学
随笔分类 - .IdentityServer4 从壹开始 [ Ids4实战 ] 之四 ║ 用户数据管理 & 前后端授权联调 摘要: 前言 哈喽~~~ 大家周一好!夏天到了,大家舒服了没有,熟话 ...
- vue 实现active点击图片切换
循环条件下: 1.点击函数@click="active(index)" 获取点击的位置 2.讲索引值传给class,点击哪一个则显示哪一个的样式 3.在data添加ins的初始值 ...
- js自增++与自减--运算符
/** * 自增(++)与自减(--)运算符 */ // 自增示例 var a = 1, c, d, e; console.log(`a++ = ${a++}`); // a++ = 1 consol ...