Tree UVA - 548
You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root of the binary tree to any leaf. The value of a path is the sum of values of nodes along that path.
Input
The input file will contain a description of the binary tree given as the inorder and postorder traversal sequences of that tree. Your program will read two line (until end of file) from the input file. The first line will contain the sequence of values associated with an inorder traversal of the tree and the second line will contain the sequence of values associated with a postorder traversal of the tree. All values will be different, greater than zero and less than 10000. You may assume that no binary tree will have more than 10000 nodes or less than 1 node.
Output
For each tree description you should output the value of the leaf node of a path of least value. In the case of multiple paths of least value you should pick the one with the least value on the terminal node.
Sample Input
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
Sample Output
1
3
255
HINT
主要难点就是建树和输出。建树采用的是递归的方式,使用map记录中序数组的下标便于查找,关键的是如何来递归,尤其要注意如何来划分左子树和右子树。具体操作看代码就好。
而输出就是一个查找,直到找到叶子结点,查到最短最小的,然后输出。其他的都是不断累加查找。
Accepted
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<fstream>
using namespace std;
vector<int>mid, pos;
map<int, int>id;
int maxx = 0x3fffff,ans=-1;
struct TREE{
int num;
TREE* left, * right;
};
TREE* build(int &i,int star,int end) {
if (star>end)return NULL;
TREE* head = new TREE;
head->num = pos[i];
head->left = head->right = NULL;
int p = id[pos[i]]; //找到在中序遍历中的位置
i--;
head->right = build(i, p + 1, end);
if (head->right != NULL)i--; //如果确实插入了就减一
head->left = build(i, star, p - 1);
if (!head->left)i++; //如果没有插入就加一
return head; //返回头指针
}
void dfs(TREE* head, int sum) {
if (!head->left && !head->right) {
sum += head->num;
if (sum < maxx || (sum == maxx && ans > head->num)) {
maxx = sum;
ans = head->num;
}
return;
}
if (head->left)dfs(head->left, head->num + sum);
if (head->right)dfs(head->right, head->num + sum);
}
int main(){
int t1,t2;
string s,s1,s2;
while (getline(cin, s1)) {
getline(cin, s2);
mid.clear();pos.clear();id.clear();
stringstream ss1(s1), ss2(s2);
while (ss1>>t1&&ss2>>t2){
mid.push_back(t1);
pos.push_back(t2);
id[t1] = mid.size() - 1;
}
int size = pos.size() - 1;
TREE* head = build(size, 0, mid.size() - 1);
maxx = 0x3fffff;
dfs(head, 0);
cout << ans << endl;
}
}
Tree UVA - 548的更多相关文章
- Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。
You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...
- 【紫书】Tree UVA - 548 静态建树dfs
题意:给你中序后序 求某叶子节点使得从根到该节点权值和最小.若存在多个,输出其权值最小的那个. 题解:先建树,然后暴力dfs/bfs所有路径,取min 技巧:递归传参数,l1,r1,l2,r2, su ...
- 树(Tree,UVA 548)
题目描述: 题目思路: 1.使用数组建树 //递归 2.理解后序遍历和中序遍历,建立左右子树 3.dfs深度搜索找出权重最小的路径 #include <iostream> #include ...
- Tree UVA - 548(二叉树递归遍历)
题目链接:https://vjudge.net/problem/UVA-548 题目大意:给一颗点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序遍历和后序遍历,找一个叶子结点使得它到根 ...
- UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)
Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...
- UVA.548 Tree(二叉树 DFS)
UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...
- UVa 548 Tree(二叉树最短路径)
You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...
- UVa 548 Tree (建树+前序后序)
Description You are to determine the value of the leaf node in a given binary tree that is the termi ...
- Uva 548 Tree
0.这是一道利用中序遍历和后序遍历确定二叉树的题目,学会建树 关键点理解这段代码 int build(int L1,int R1,int L2,int R2) { //printf("bui ...
随机推荐
- Python学习相关链接
感觉挺全的: http://www.cnblogs.com/xinshiye/p/9015187.html 也挺全的:http://www.cnblogs.com/toutou/category/72 ...
- brew安装Nginx
目录 安装流程 常用命令记录 典型配置方式 查看启动状态是否有报错 php 启动 参考 安装流程 这里使用 brew 来安装软件. 安装 brew install nginx 查看安装信息(经常用到, ...
- 剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数 Offer 15 题目描述: 方法一:使用1逐位相与的方式来判断每位是否为1 /** * 方法一:使用1逐位与的方法 */ public class Off ...
- HDOJ-2087(KMP算法)
剪花布条 HDOJ-2087 本题和hdoj-1686相似,唯一不同的是这里的子串一定要是单独的.所以在确定有多少个子串时不能用前面的方法.而是在循环时,只要找到一个子串,i就不是++,而是+=子串的 ...
- python引用C++ DLL文件若干解释及示例
python引用C++ DLL文件若干解释及示例 首先说一下,python不支持C++的DLL,但是支持C的DLL:C++因为和C兼容可以编译为C的DLL,这是下面文章的背景与前提 首先我这儿的示例使 ...
- C# 应用 - 使用 WebClient 发起 Http 请求
1. 需要的库类 \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.dll System.Net.WebCli ...
- 史上超强拷贝仓——GitHub 热点速览 v.21.11
作者:HelloGitHub-小鱼干 Clone-Wars 是真的强,能细数 70+ 知名应用网站的源码,即便你不看代码,也可以了解下各大网站的所用技术栈.同样很强的是用 OpenCV 实现的图片转 ...
- 轻量易用的微信Sdk发布——Magicodes.Wx.Sdk
概述 最简洁最易于使用的微信Sdk,包括公众号Sdk.小程序Sdk.企业微信Sdk等,以及Abp VNext集成. GitHub地址:https://github.com/xin-lai/Magico ...
- TCP/IP协议的经典面试知识点总结
前言 大家好啊,我是汤小圆. 今天给大家推荐的是,TCP/IP协议的经典面试知识点总结,希望对大家有帮助,谢谢. 简介 我们平时经常听到的TCP/IP协议,其实是一个协议族: 只不过因为TCP.IP是 ...
- Webpack 5 配置手册(从0开始)
针对新手入门搭建项目,Webpack5 配置手册(从0开始) webpack安装顺序 1. `npm init -y`,初始化包管理文件 package.json 2. 新建src源代码目录 3. 新 ...