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

样例输入:
3 2 1 4 5 7 6
3 1 2 5 6 7 4
7 8 11 3 5 16 12 18
8 3 11 7 16 18 12 5
255
255
样例输出:
1
3
255

//因为各个结点的权值各不相同且都是正整数,直接用权值作为结点编号
const int maxv = 10000 + 10;
int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];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;
}//把in_order[L1..R1]和post_order[L2..R2]建成一棵二叉树,返回树根
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() {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;
}

个人理解:本质上还是自底向上建树,且在build函数中最左边下标始终不变为0,而每次新建一棵树,p为中序遍历得到的根节点下标,则p-1为根节点的下一个左孩子
stringstream s(line);
while (s >> x) a[n++] = x;
read_list函数用于将输入的字符串写入到数组中, 使用 string 对象来代替字符数组(snprintf方式),就避免缓冲区溢出的危险
相关使用示例:
stringstream sstream;
string strResult;
int nValue = 1000;

// 将int类型的值放入输入流中
sstream << nValue;
// 从sstream中抽取前面插入的int类型的值,赋给string类型
sstream >> strResult;

【练习】树(Tree, UVa 548)给一棵点带权(权值各不相同)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。相关推荐

  1. 43行代码AC——例题6-8 树(Tree,UVa 548)——解题报告

    励志用尽量少的代码做高效的表达. You are to determine the value of the leaf node in a given binary tree that is the ...

  2. (二叉树的遍历)Tree UVa 548

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

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

    题目链接:https://vjudge.net/problem/UVA-548 题目大意:给一颗点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序遍历和后序遍历,找一个叶子结点使得它到根 ...

  4. 【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)

    本次笔记内容: 练习题-TTA.1 题意理解 练习题-TTA.2 核心算法 文章目录 题意理解 根据Push与Pop直接得出先序.中序数组 根据pre和in生成post C实现 题意理解 先来回忆非递 ...

  5. java二叉树合并_Java(树的前中后序遍历构造二叉树题型整合)前序和中序、中序和后序、前序和后序遍历序列构造二叉树算法整合归纳...

    前言 二叉树各种花里胡哨的算法题真的把我搞晕了,今天特地整理出一类有关二叉树的算法题,希望能帮助阅读到此文章的人,今后不再受此类题型的困扰. 一.题目类型 已知二叉树的两种遍历序列,请根据该序列构建二 ...

  6. 树-树的遍历(先序、中序、后序)

    树的遍历 树的遍历方式主要分为四种,先序.中序.后序和层序,在这篇博客中我将仔细介绍一下树的这四种遍历方式. 先序遍历 先序遍历,也叫先根遍历.前序遍历,首先访问根结点然后遍历左子树,最后遍历右子树. ...

  7. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

    zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件:       ⑴有且仅有一个结点没有前驱 ...

  8. 代码随想录第18天|找树左下角的值,路径总和,从中序和后序遍历序列构造二叉树

    LeetCode513.找树左下角的值 题目链接:513. 找树左下角的值 - 力扣(LeetCode) 思路: 迭代法(只需要记录最后一行第一个节点的数值就可以了.): /*** Definitio ...

  9. 手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历(从创建二叉树到各种方式遍历)(含运行结果)

    手动创建一棵二叉树,然后利用前序.中序.后序.层序进行遍历 import java.util.LinkedList; import java.util.List; import java.util.Q ...

最新文章

  1. Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)
  2. RxJava 从源码到使用
  3. Android分享功能
  4. swift_016(Swift 的闭包)
  5. 网易2013校园招聘笔试题集锦
  6. c语言结果九位数,C语言实例:九位累进可除数
  7. 如何用excel筛选相似内容_excel如何筛选出相同内容,excel怎么用公式筛选
  8. Java中的断言assert的用法
  9. 06 - 雷达发射机 概述
  10. 如何突破百度云下载速度限制
  11. VirtualBox 端口转发(端口映射) 主机和虚拟机相互访问
  12. [luogu] CF128A Statues dfs
  13. 解决beyond compare秘钥被吊销的问题
  14. Jenkins集成Django
  15. 第四届橙瓜网络文学奖网文之王,烽火戏诸侯舍我其谁?
  16. 政企内部即时通讯软件都有哪些?
  17. 机械键盘各类轴的区别
  18. 济南市高新技术企业认定补助
  19. drop、delete、truncate比较
  20. 功耗大好还是小好_额定功率大好还是小好

热门文章

  1. linux是基于什么的软件模式进行发布的,《Linux操作系统与应用项目教程》习题.doc...
  2. postgresql mysql fdw_PostgreSQL使用MySQL外表(mysql_fdw)
  3. c语言多关卡推箱子程序,多关卡地图推箱子游戏
  4. mysql b-a全局索引_MySQL中B+树索引的使用
  5. 期末复习、化学反应工程科目(第五章)
  6. 三十四、R语言数据分析实战
  7. 三十五、Scrapy 中的杂知识总结和代理池的编写
  8. 自监督学习的发展趋势:事半功倍的模型训练和数据效能
  9. Transformer升级之路:二维位置的旋转式位置编码
  10. 宅在家限制智力输出?这场论文复现赛让思维发光