这是一个很经典的建树,然而当时不会!!!!

给你一个中序和后序 先建一个二叉树,然后找最优解(最优解就是一个叶子节点到根节点权值最小, 同时本身权值最小)

//生成一棵树

  1. int build(int L1, int R1, int L2, int R2) { //表示1为中序,2为后序 生成这个二叉树 其中R2为这棵树的根
  2. if(L1 > R1) return 0;
  3. int root = post_order[R2];
  4. int p = L1;
  5. while(in_order[p] != root) ++p; //在中序中找到根的位置
  6. int cnt = p - L1; //cnt表示当前这棵树左子树的大小
  7. lch[root] = build(L1, p-1, L2, L2 + cnt -1);//这里要知道在后序中,左子树(cnt),右子树,根
  8. rch[root] = build(p+1, R1, L2+cnt, R2-1); //那么我们就能知道他们的划分位置,继续递归生成树
  9. return root;
  10. }

//遍历这棵树

  1. int best,best_sum;
  2.  
  3. void dfs(int u, int sum) {
  4. sum += u;
  5. if(!lch[u] && !rch[u]) { //叶子节点
  6. if(sum < best_sum || (sum == best_sum && u < best)){
  7. best = u;best_sum = sum;
  8. }
  9. }
  10. if(lch[u]) dfs(lch[u], sum); //接着递归
  11. if(rch[u]) dfs(rch[u], sum);
  1. }


  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<string>
  6. #include<queue>
  7. #include<cstdlib>
  8. #include<algorithm>
  9. #include<stack>
  10. #include<map>
  11. #include<queue>
  12. #include<vector>
  13. #include<sstream>
  14. using namespace std;
  15. const int maxn = 1e4+100;
  16. int in_order[maxn], post_order[maxn], lch[maxn], rch[maxn];
  17. int n;
  18. bool read_list(int* a) {
  19. string line;
  20. if(!getline(cin, line)) return false;
  21. stringstream ss(line);
  22. n = 0;
  23. int x;
  24. while(ss>>x) a[n++] = x;
  25. return n > 0;
  26. }
  27.  
  28. int build(int L1, int R1, int L2, int R2) {
  29. if(L1 > R1) return 0;
  30. int root = post_order[R2];
  31. int p = L1;
  32. while(in_order[p] != root) ++p;
  33. int cnt = p - L1;
  34. lch[root] = build(L1, p-1, L2, L2 + cnt -1);
  35. rch[root] = build(p+1, R1, L2+cnt, R2-1);
  36. return root;
  37. }
  38.  
  39. int best,best_sum;
  40.  
  41. void dfs(int u, int sum) {
  42. sum += u;
  43. if(!lch[u] && !rch[u]) {
  44. if(sum < best_sum || (sum == best_sum && u < best)){
  45. best = u;best_sum = sum;
  46. }
  47. }
  48. if(lch[u]) dfs(lch[u], sum);
  49. if(rch[u]) dfs(rch[u], sum);
  50. }
  51.  
  52. int main(){
  53. #ifdef LOCAL
  54. freopen("in.txt","r",stdin);
  55. // freopen("out.txt","w",stdout);
  56. #endif
  57. while(read_list(in_order)) {
  58. read_list(post_order);
  59. build(0, n-1, 0, n-1);
  60. best_sum = 1000000000;
  61. dfs(post_order[n-1],0);
  62. cout << best << "\n";
  63. }
  64. return 0;
  65. }

UVA_548Tree的更多相关文章

随机推荐

  1. 【C#学习笔记】 List.AddRange 方法

    [官方笔记] 将指定集合的元素添加到 List 的末尾 命名空间:System.Collections.Generic程序集:mscorlib(在 mscorlib.dll 中) public: vo ...

  2. PAT 2019-3 7-3 Telefraud Detection

    Description: Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, ...

  3. VLAN基础配置及Access接口 实验1

    1.Access接口 是交换机上与PC机上相连的端口 2.当主机向交换机发送数据帧时,经过的Access口会将该帧加一个与自己PVID一致的VLAN标签 当交换机的Access口要发送给PC机一个带有 ...

  4. 实验报告(七)&第九周课程总结

    班级 计科二班 学号 20188425 姓名 IM 完成时间2019/10/24 评分等级 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: ...

  5. Python 学习笔记12 函数模块

    函数的优点之一,使用它们可将代码块与主程序分离.通过给函数指定描述性的名称.可以让主程序非常好理解.但是如果将过多的函数和主程序放置在一起,会让文件显得非常凌乱.太多的代码混杂在一起,不方便管理.我们 ...

  6. java反射(三)--反射与操作类

    一.反射与操作类 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成的操作,任何一个类的基本组成结构:父类(父接口),包,属性,方法(构造方法,普通方法)--获取类的 ...

  7. javaIO流(二)--字节流与字符流

    一.流的基本概念 在java.io包中,File类是唯一一个与文件本身有关的程序处理类,但是File类只能操作文件本身,而不能操作文件内容,IO操作的核心意义在于输入和输出操作.而对于程序而言,输入和 ...

  8. 【目录】Identityserver 4 老张的哲学

    随笔分类 - .IdentityServer4 从壹开始 [ Ids4实战 ] 之四 ║ 用户数据管理 & 前后端授权联调 摘要: 前言 哈喽~~~ 大家周一好!夏天到了,大家舒服了没有,熟话 ...

  9. vue 实现active点击图片切换

    循环条件下: 1.点击函数@click="active(index)" 获取点击的位置 2.讲索引值传给class,点击哪一个则显示哪一个的样式 3.在data添加ins的初始值 ...

  10. js自增++与自减--运算符

    /** * 自增(++)与自减(--)运算符 */ // 自增示例 var a = 1, c, d, e; console.log(`a++ = ${a++}`); // a++ = 1 consol ...