UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)
Tree UVA - 548
题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的。还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的。
最后输出来叶子节点。
一开始写的时候是用gets读入的,报CE,
要用fgets写,关于fgets(),传送门:
一开始用bfs过的,后来发现,好多人都是dfs过的,又写了一下dfs。。。
代码:
//二叉树的中序和后序遍历还原树并输出最短路径的叶子节点值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
const int inf=0x3f3f3f3f; struct node{
int l,r,val,father;
}tree[maxn]; int n=,minn,leaf;
int mid[maxn],beh[maxn]; int build(int la,int ra,int lb,int rb)
{
if(la>ra) return ;
int rt=beh[rb];
int p1=la;
while(mid[p1]!=rt) p1++;
int p2=p1-la;
tree[rt].l=build(la,p1-,lb,lb+p2-);
tree[rt].r=build(p1+,ra,lb+p2,rb-);
return rt;
} /*
int fa[maxn]; void bfs(int x)
{
queue<int> q;
vector<int> vec;
q.push(x);
fa[x]=0;tree[0].val=0;
while(!q.empty()){
int rt=q.front();q.pop();
if(rt==0){
break;
}
tree[rt].val=tree[fa[rt]].val+rt;
// cout<<tree[rt].val<<endl;
if(tree[rt].l){
fa[tree[rt].l]=rt;
q.push(tree[rt].l);
}
if(tree[rt].r){
fa[tree[rt].r]=rt;
q.push(tree[rt].r);
}
if(tree[rt].l==0&&tree[rt].r==0){
vec.push_back(rt);
} }
int l=vec.size();
int minn=inf,ans=inf;
for(int i=0;i<l;i++){
if(tree[vec[i]].val<minn){
minn=tree[vec[i]].val;
ans=vec[i];
}
if(tree[vec[i]].val==minn){
if(vec[i]<ans) ans=vec[i];
}
}
printf("%d\n",ans);
}
*/ void dfs(int rt,int sum)
{
sum+=rt;
if(!tree[rt].l&&!tree[rt].r){
if(sum<minn||(sum==minn&&rt<leaf)){
minn=sum;
leaf=rt;
}
}
if(tree[rt].l) dfs(tree[rt].l,sum);
if(tree[rt].r) dfs(tree[rt].r,sum);
} char c[maxn]; int main()
{
while(fgets(c,maxn,stdin)){
int l=strlen(c);
int i=,cnt=;
if(n==){
while(i<l){
if(c[i]=='\0') break;
if(c[i]==' '||c[i]=='\n') i++,mid[++n]=cnt,cnt=;
else{
cnt=cnt*+c[i]-'';
i++;
}
}
}
else{
n=;
while(i<l){
if(c[i]=='\0') break;
if(c[i]==' '||c[i]=='\n') i++,beh[++n]=cnt,cnt=;
else{
cnt=cnt*+c[i]-'';
i++;
}
}
build(,n,,n);
// bfs(beh[n]);
minn=inf,leaf=beh[n];
dfs(beh[n],);
printf("%d\n",leaf);
n=;
}
}
}
UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)的更多相关文章
- UVA.548 Tree(二叉树 DFS)
UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...
- uva 548 Tree(通过后序,先序重建树+dfs)
难点就是重建树,指针參数的传递今天又看了看.应该是曾经没全然弄懂.昨天真没效率,还是不太专心啊.以后一定得慢慢看.不能急躁,保持寻常心,. 分析: 通过兴许序列和中序序列重建树,用到了结构体指针.以及 ...
- 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】
[145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...
- SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...
- SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- UVa 548 Tree【二叉树的递归遍历】
题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小. 学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点 虽然紫书的思路很清晰= =可是理解起来好困 ...
- 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 ...
随机推荐
- each jquery
<div class="first"> <span>投保人数:</span> <input type="text" i ...
- 【c#】winform 上传图片
1.拖拽上传图片 1.1.后台代码中修改窗体属性,添加 AllowDrop = true 1.2.给窗体添加拖拽事件,在事件列表找到拖拽 双击即可: 在 DragDrop 生成的方法中添加代码如下: ...
- jquery-validate校验
开源地址:https://github.com/jquery-validation/jquery-validation 校验select添加如下属性: ignore: ":hidden:no ...
- 【Android】完善Android学习(四:API 3.1)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- MS SQL 启用标识插入
解决MSSQL字段为标识不能插入办法http://www.veryhuo.com 2009-09-21 Liehuo.Net 投递稿件 我有话说当 IDENTITY_INSERT 设置为 OFF 时, ...
- mybatis在Mapper的xml文件中的转义字符的处理
XML转义字符 < < 小于号 > > 大于号 & & 和 ' ’ 单引号 " " 双引号 用转义字符进行替换 例如 SE ...
- [uva11997]k个最小和
一个k*k的矩阵,每行选取一个数相加则得到一个和,求最小的前k个和. k<=750 已知前m行最小的前k个和d[1]…d[k],则前m+1行最小的前k个和都必定是d[i](i<=k)+a[ ...
- 【BZOJ1221】【HNOI2001】软件开发 [费用流]
软件开发 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 某软件公司正在规划一项n天的软件开 ...
- 【游记】NOIP 2017
时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...
- HDU 2546 饭卡 (dp)
题目链接 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上 ...