题目链接:https://vjudge.net/problem/UVA-548

题目大意:给一颗点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序遍历和后序遍历,找一个叶子结点使得它到根的路径上的权值和最小。如果有多个解,该叶子本身的权值应尽量小。输入中每两行表示一棵树,其中第一行为中序遍历,第二行为后续遍历。

看代码:

  1. #include<iostream>
  2. #include<string.h>
  3. #include<stdio.h>
  4. #include<vector>
  5. #include<queue>
  6. #include<sstream>
  7. using namespace std;
  8. const int maxv=+;
  9. int in_order[maxv],post_order[maxv],lch[maxv],rch[maxv];
  10. int n;
  11. int best,best_sum;//目前为止最优解和对应的权值和
  12. bool read_list(int *a)
  13. {
  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. int build(int L1,int R1,int L2,int R2)
  24. {
  25. if(L1>R1) return ;//空树
  26. int root=post_order[R2];//后序遍历最后一个结点就是树根
  27. int p=L1;
  28. while(in_order[p]!=root) p++;//在中序遍历中找到根结点所在的位置
  29. int cnt1=p-L1;//左子树结点的个数
  30. lch[root]=build(L1,p-,L2,L2+cnt1-);
  31. rch[root]=build(p+,R1,L2+cnt1,R2-);
  32. return root;
  33. }
  34. void dfs(int u,int sum)
  35. {
  36. sum+=u;
  37. if(!lch[u]&&!rch[u])//代表叶子结点
  38. {
  39. if(sum<best_sum||(sum==best_sum&&u<best))
  40. {
  41. best=u;
  42. best_sum=sum;
  43. }
  44. }
  45. if(lch[u]) dfs(lch[u],sum);
  46. if(rch[u]) dfs(rch[u],sum);
  47. }
  48. int main()
  49. {
  50. while(read_list(in_order))
  51. {
  52. read_list(post_order);
  53. build(,n-,,n-);
  54. best_sum=;
  55. dfs(post_order[n-],);
  56. cout<<best<<endl;
  57. }
  58. return ;
  59. }

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

  1. Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。

    You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...

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

    一.先序递归遍历(Preorder Recursive Traversal) 1.1 算法 首先需要明确的是这里的序是针对 root 节点而言的.故先序即先“访问”根节点,其次“访问”其左右节点. 1 ...

  3. [LeetCode]144. Binary Tree Preorder Traversal二叉树前序遍历

    关于二叉树的遍历请看: http://www.cnblogs.com/stAr-1/p/7058262.html /* 考察基本功的一道题,迭代实现二叉树前序遍历 */ public List< ...

  4. UVa 548 (二叉树的递归遍历) Tree

    题意: 给出一棵由中序遍历和后序遍历确定的点带权的二叉树.然后找出一个根节点到叶子节点权值之和最小(如果相等选叶子节点权值最小的),输出最佳方案的叶子节点的权值. 二叉树有三种递归的遍历方式: 先序遍 ...

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

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

  6. java 二叉树递归遍历算法

    //递归中序遍历 public void inorder() { System.out.print("binaryTree递归中序遍历:"); inorderTraverseRec ...

  7. python实现二叉树递归遍历与非递归遍历

    一.中序遍历 前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置.对于中序遍历来说,根结点的遍历位置在中间. 所以中序遍历的顺序:左中右 1.1 递归实现 ...

  8. Tree UVA - 548

      You are to determine the value of the leaf node in a given binary tree that is the terminal node o ...

  9. leetcode Binary Tree Postorder Traversal 二叉树后续遍历

    先给出递归版本的实现方法,有时间再弄个循环版的.代码如下: /** * Definition for binary tree * struct TreeNode { * int val; * Tree ...

随机推荐

  1. Inheritance with EF Code First: Part 1 – Table per Hierarchy (TPH)

    以下三篇文章是Entity Framework Code-First系列中第七回:Entity Framework Code-First(7):Inheritance Strategy 提到的三篇.这 ...

  2. C++新标准:列表初始化

    一.列表初始化意义 C++新标准为vector提供了一种新的初始化方式:列表初始化.适用于知道多个成员具体值的情况. 二.列表初始化用法 /*1.空vector<int>*/ vector ...

  3. C++轮子队-第六周--事后分析

    C++轮子队 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 实现2048+俄罗斯方块结合的小游戏,定义的比较清楚,典型用户也很清晰,提供给那些对该类游 ...

  4. Android - AndroidStudio 的熟悉

    开发环境 * JDK * SDK * AndroidStudio * Genimotioin HelloWorld [ 第一个Android项目建立 ] * 创建项目  [ 项目相关目录 ] Hell ...

  5. MAC的开机启动

    之前了解到MAC下的开机启动和定时自动运行不再沿用cron,而是有自己的launchctl:把启动文件放在/Library/LaunchDaemon/xxx.plist,里面可以记录运行的时间间隔.工 ...

  6. thinkphp 连接数据库 & 实例化模型操作 (下接thinkphp CURD 操作)/慕课

    7.1 连接数据库 (06:15) 1 7.2实例化模型 1 1.实例化基础模型 2 2. 实例化用户自定义模型 2 问题 2 3. 实例化公共模型 4 4. 实例化空模型 7    7.1 连接数据 ...

  7. Hystrix线程隔离技术解析-线程池(转)

    认识Hystrix Hystrix是Netflix开源的一款容错框架,包含常用的容错方法:线程隔离.信号量隔离.降级策略.熔断技术. 在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有 ...

  8. Jmeter-无法启动,'findstr'不是内部或外部命令,也不是可运行的程序

    今天有一个同事的jmeter无法安装,于是帮他看了看,报以下错误: JAVA的环境变量没有配置好,于是重新配置了下环境变量后,再启动,发现还是不好,于是网上查了下, 发现要在电脑的环境变量中增加 pa ...

  9. 明明有印象却找不到,APP内搜索为什么这么难用?

    赶上了互联网浪潮的当代人,每当有任何困扰,第一反应都是打开搜索引擎. 什么叫做“硬核相亲”,什么是“pick一下”,“达达主义”,“隐形贫困人口”——你都默默搜索过,不想被时代与话题抛弃.也许只有这样 ...

  10. C++基础学习9:构造函数和析构函数

    1.  构造函数用来对类对象进行初始化,它完成对内存空间的申请.赋初值等工作.  2.  析构函数主要是用来做清理工作的. 补充:函数名或变量名前面有"::"但是没有类名,说明这是 ...