题意:

给出一棵由中序遍历和后序遍历确定的点带权的二叉树。然后找出一个根节点到叶子节点权值之和最小(如果相等选叶子节点权值最小的),输出最佳方案的叶子节点的权值。

二叉树有三种递归的遍历方式:

  1. 先序遍历,先父节点  然后左孩子  最后右孩子
  2. 中序遍历,先左孩子  然后父节点  最后父节点
  3. 后序遍历,先左孩子  然后右孩子  最后父节点

这里有更详细的解释:

http://blog.csdn.net/sicofield/article/details/9066987

紫书上面写错了,后序遍历最后一个元素才是根节点。确定根节点以后,我们再根据这个值在中序遍历的序列中找到他。然后以根节点为界,左边的元素是左子树的元素,右边的元素是右子树的元素。再进行递归。

关于中序遍历和后序遍历的关系,这里写的很具体:

http://blog.csdn.net/frankiller/article/details/7759871

因为权值各不相同,所以用权值的大小来作为节点编号。

  1. //#define LOCAL
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <string>
  5. #include <sstream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int maxv = + ;
  10. int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];
  11. int n;
  12.  
  13. bool read_list(int* a)
  14. {
  15. string line;
  16. if(!getline(cin, line)) return false;
  17. stringstream ss(line);
  18. n = ;
  19. int x;
  20. while(ss >> x) a[n++] = x;
  21. return n > ;
  22. }
  23.  
  24. int build(int L1, int R1, int L2, int R2)
  25. {
  26. if(L1 > R1) return ;
  27. int root = post_order[R2];
  28. int p = L1;
  29. while(in_order[p] != root) p++;
  30. int cnt = p - L1; //左子树节点的个数
  31. lch[root] = build(L1, p - , L2, L2 + cnt - );
  32. rch[root] = build(p + , R1, L2 + cnt, R2 - );
  33. return root;
  34. }
  35.  
  36. int best, best_sum;
  37.  
  38. void DFS(int u, int sum)
  39. {
  40. sum += u;
  41. if(!lch[u] && !rch[u])
  42. {//叶子
  43. if(sum < best_sum || (sum == best_sum && u < best))
  44. {
  45. best = u;
  46. best_sum = sum;
  47. }
  48. }
  49. if(lch[u]) DFS(lch[u], sum);
  50. if(rch[u]) DFS(rch[u], sum);
  51. }
  52.  
  53. int main(void)
  54. {
  55. #ifdef LOCAL
  56. freopen("548in.txt", "r", stdin);
  57. #endif
  58.  
  59. while(read_list(in_order))
  60. {
  61. read_list(post_order);
  62. build(, n-, , n-);
  63. best_sum = ;
  64. DFS(post_order[n-], );
  65. printf("%d\n", best);
  66. }
  67.  
  68. return ;
  69. }

代码君

UVa 548 (二叉树的递归遍历) Tree的更多相关文章

  1. Uva 548 二叉树的递归遍历lrj 白书p155

    直接上代码... (另外也可以在递归的时候统计最优解,不过程序稍微复杂一点) #include <iostream> #include <string> #include &l ...

  2. 二叉树的递归遍历 Tree UVa548

    题意:给一棵点带权的二叉树的中序和后序遍历,找一个叶子使得他到根的路径上的权值的和最小,如果多解,那该叶子本身的权值应该最小 解题思路:1.用getline()输入整行字符,然后用stringstre ...

  3. 二叉树的递归遍历 The Falling Leaves UVa 699

    题意:对于每一棵树,每一个结点都有它的水平位置,左子结点在根节点的水平位置-1,右子节点在根节点的位置+1,从左至右输出每个水平位置的节点之和 解题思路:由于上题所示的遍历方式如同二叉树的前序遍历,与 ...

  4. 数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)

    Nonrecursive Traversal of Binary Tree First I wanna talk about why we should <code>Stack</c ...

  5. C++编程练习(17)----“二叉树非递归遍历的实现“

    二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历 ...

  6. Trees on the level UVA - 122 (二叉树的层次遍历)

    题目链接:https://vjudge.net/problem/UVA-122 题目大意:输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个结点的值.每个结点都按照从根节点到它的移动序列给出 ...

  7. UVa 548 Tree【二叉树的递归遍历】

    题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小. 学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点 虽然紫书的思路很清晰= =可是理解起来好困 ...

  8. UVA - 548 Tree(二叉树的递归遍历)

    题意:已知中序后序序列,求一个叶子到根路径上权和最小,如果多解,则叶子权值尽量小. 分析:已知中序后序建树,再dfs求从根到各叶子的权和比较大小 #include<cstdio> #inc ...

  9. UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)

    题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...

随机推荐

  1. Excel每隔两行自动求和一次怎么操作?

    今天ytkah得到一份数据,要求进行统计分析,由于是原始数据,还没处理过,数据量有点大,如下图所示(Excel每隔两行自动求和),每天的数字由两项组成,男生的人数.消费值和女生的人数和消费值,数字都在 ...

  2. spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式

    我们知道,spark中每个分片都代表着一部分数据,那么分片数量如何被确认的呢? 首先我们使用最常见的HDFS+Spark,sparkDeploy的方式来讨论,spark读取HDFS数据使用的是spar ...

  3. 迁移到MariaDB galera

    迁移到MariaDB galera [已注销] [已注销] -- :: [安装] ====== https://downloads.mariadb.org/mariadb/repositories/ ...

  4. JSP 页面传参和接受参数

    <%@ page language="java" contentType="text/html; charset=GBK" pageEncoding=&q ...

  5. uva 11090

    I I U P C 2 0 0 6 Problem G: Going in Cycle!! Input: standard input Output: standard output You are ...

  6. 理解Flight框架核心

    http://blog.csdn.net/sky_zhe/article/details/38906689 Flight 框架 Flight类 1.加载 autoload.php ,启动框架的自动加载 ...

  7. swift函数和初始化控件(// MARK:分割线)

    import UIKit , , , )         view.backgroundColor = UIColor.redColor()         self.view.addSubview( ...

  8. POJ 1989

    #include <iostream> #define MAXN 10005 using namespace std; bool mark[MAXN]; int main() { //fr ...

  9. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

  10. 离开csdn来到blog园

    csdn里没有限制阅读访问的功能,所以我选择来到cnblog 但是不得不说,cnblog做的界面很丑,我个人很不喜欢,但是没办法