题意:

给出后序遍历和先序遍历, 还原一棵树, 然后求出从根节点到叶子的最小路劲和。

分析:

已知后序遍历, 那么后序的最后一个节点就是根节点, 然后在中序中找到这个节点, 它的左边就是左子树, 它的右边就是右子树, 然后递归下去。

技巧是不断的变动[r1,l1] [r2,l2]

r1 l1是中序的区间 r2 l2是后序的区间

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = + ;
  4. int In_order[maxn], Post_order[maxn], lch[maxn], rch[maxn];
  5. int tot, cnt;
  6. //[L1,R1] , [L2,R2];
  7. bool read(int* a){
  8. string t;
  9. if(!getline(cin, t))
  10. return false;
  11. int n = , x;
  12. stringstream ss(t);
  13. while(ss >> x) a[n++] = x;
  14.  
  15. tot = n;
  16. if(n == ) return false;
  17. else return true;
  18. }
  19. int bulid(int L1, int R1, int L2, int R2){
  20. if(R1 < L1) { return ;}
  21. int root = Post_order[R2];
  22. int p = L1;
  23. while(In_order[p] != root) p++;
  24. int pcnt = p - L1;
  25. lch[root] = bulid(L1, p-,L2, L2 + pcnt -);
  26. rch[root] = bulid(p+, R1,L2 + pcnt, R2 - );
  27. return root;
  28. }
  29. int best_sum = 1e9, best;
  30. void dfs(int u, int sum)
  31. {
  32. sum += u;
  33. if(!lch[u] && !rch[u]){
  34. if(sum < best_sum || (sum == best_sum && u < best)){
  35. best = u; best_sum = sum;
  36. }
  37. }
  38. if(lch[u]){
  39. dfs(lch[u],sum);
  40. }
  41. if(rch[u]){
  42. dfs(rch[u],sum);
  43. }
  44. }
  45. int main(){
  46. while(read(In_order)){
  47. memset(lch,,sizeof(lch));
  48. memset(rch,,sizeof(rch));
  49. best_sum = 1e9, best = ;
  50. read(Post_order);
  51. cnt = ;
  52. bulid(,tot-,,tot-);
  53. dfs(Post_order[tot-],);
  54. printf("%d\n", best);
  55. }
  56. return ;
  57. }

UVa 548 树(已知其中两种遍历, 还原树)的更多相关文章

  1. POJ 2631 Roads in the North(求树的直径,两次遍历 or 树DP)

    题目链接:http://poj.org/problem?id=2631 Description Building and maintaining roads among communities in ...

  2. php 两种获取分类树的方法

    php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...

  3. HashMap的两种遍历方式

    HashMap的两种遍历方式 HashMap存储的是键值对:key-value . java将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了Hash ...

  4. Map的两种遍历方式

    ********************************************************************************* ****************** ...

  5. POJ 3225 线段树区间更新(两种更新方式)

    http://blog.csdn.net/niuox/article/details/9664487 这道题明显是线段树,根据题意可以知道: (用0和1表示是否包含区间,-1表示该区间内既有包含又有不 ...

  6. 已知有两个水杯,一个11L一个7L,水可以任意使用,求怎么得到2L 的详细解法

    问题:有两个水杯,一个是11L一个是7L,水可以随便用,怎么得到2L 1.了解问题的本质 问题中给出了两个杯子,只有这两个杯子有量度,所以只能让杯中的水满进满出才能确定杯子中最后有多少水. 现在问题要 ...

  7. Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

    用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是 回调函数.我的理解是这样的: 回 调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等 ...

  8. HashMap两种遍历方式的深入研究

    转自:http://swiftlet.net/archives/1259 HashMap的遍历有两种方式,如下所示:第一种利用entrySet的方式:   1 2 3 4 5 6 7 Map map ...

  9. HashMap两种遍历数据的方式

    HashMap的遍历有两种方式,一种是entrySet的方式,另外一种是keySet的方式. 第一种利用entrySet的方式: Map map = new HashMap(); Iterator i ...

随机推荐

  1. Trie树的小应用——Chemist

    题意(自己编的): 给你一篇文章,包含n个长度为Si的单词,然后给你m组询问,每次询问一个单词在这篇文章中作为单词前缀出现的次数.n <=10^6,m<=10^6,Si<=100. ...

  2. maven项目管理1

    1.maven的目录结构 src -main -java -package -test -java -package resources 2.maven命令 mvn -v :查看maven版本命令 c ...

  3. 配置yum源的步骤(阿里源)

    配置yum源的步骤1.可以移除默认的yum仓库,也就是删除 /etc/yum.repos.d/底下所有的.repo文件(踢出国外的yum源) 1.配置yum源,找到阿里云的官方镜像源地址 https: ...

  4. [ZOJ1961]Let it Bead

    Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. ...

  5. Coins HDU - 2844 POJ - 1742

    Coins HDU - 2844 POJ - 1742 多重背包可行性 当做一般多重背包,二进制优化 #include<cstdio> #include<cstring> in ...

  6. TestNG基本注解(一)

    TestNG基本注解   注解 描述 @BeforeSuite 注解的方法将只运行一次,运行所有测试前此套件中. @AfterSuite 注解的方法将只运行一次此套件中的所有测试都运行之后. @Bef ...

  7. JavaScript的执行

    下面内容参考:http://blog.csdn.net/cxiaokai/article/details/7552653 http://www.jb51.net/article/36755.htm 首 ...

  8. BufferedStream

    处理流,包在别的流上面的流,相当于包到别的管道上面的管道. 缓冲刘: 缓冲流,就是带小桶的带缓冲区的. 那两个方法知道一下就好了,不必深究…… bis.read()    read一下读一个出来 bi ...

  9. 446 Arithmetic Slices II - Subsequence 算数切片之二 - 子序列

    详见:https://leetcode.com/problems/arithmetic-slices-ii-subsequence/description/ C++: class Solution { ...

  10. python vs java的rsa加密

    首先:java的加密解密模块需要更加精细的算法细节指定 java的加密方式 javax.crypto.Cipher,定义的获取方式 tatic Cipher getInstance(String tr ...