UVa:548 Tree
来源:互联网 发布:奥贵银软件下载 编辑:程序博客网 时间:2024/05/20 07:16
这个题跪了好多次居然都是因为读错题了。
它要求在某条路径最小的情况下的叶结点的值。如果存在多条最小路径,则取最小的叶结点。
后序的最后一个结点是根节点。在中序序列中找到该结点的位置,右边是右子树,左边是该结点的左子树。注意要先递归右子树。
直接用后序和中序推出一个树的遍历过程,然后求就行了。用不着建树。
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#define MAXN 10005using namespace std;int rear[MAXN],mid[MAXN];int hash_mid[MAXN];int minn,pos,n,ans;void solve(int a,int b ,int sum){ if(a>b) return ; pos--; sum+=rear[pos]; if(a==b) { if(sum<minn) { minn=sum; ans=rear[pos]; } else if(sum==minn) ans=min(ans,rear[pos]); } else { int c=hash_mid[rear[pos]]; solve(c+1,b,sum); solve(a,c-1,sum); }}int main(){ char c; int temp; while(scanf("%d%c",&temp,&c)!=EOF) { n=0; memset(hash_mid,0,sizeof(hash_mid)); memset(mid,0,sizeof(mid)); memset(rear,0,sizeof(rear)); mid[n]=temp; hash_mid[mid[n]]=n; n++; if(c!='\n') { while(scanf("%d%c",&mid[n],&c)) { hash_mid[mid[n]]=n; n++; if(c=='\n') break; } } n=0; while(scanf("%d%c",&rear[n],&c)) { n++; if(c=='\n') break; } minn=10000*10000; pos=n; ans=MAXN; solve(0,n-1,0); printf("%d\n",ans); } return 0;}
0 0
- UVa 548 Tree
- uva 548 Tree
- uva 548 - Tree
- uva 548 - Tree
- UVa 548 - Tree
- uva 548 Tree
- uva 548 - Tree
- 数据结构 uva 548-Tree
- UVA 548 - Tree
- UVa 548 - Tree
- UVa 548 - Tree
- uva-548 Tree
- UVA 548 Tree
- UVA 548 tree
- uva 548 -Tree
- uva 548 Tree
- 548 - Tree (UVa OJ)
- UVA 548 Tree
- WPF 触发器
- ASP.NET Dynamic Data (动态数据)
- Ubuntu/Fedora高版本安装海思SDK的方法
- DM8168说明(一)
- 21分钟 MySQL 入门教程
- UVa:548 Tree
- C/C++经典题解析
- orcad打开pcbdpc
- 算法导论15章 动态规划之矩阵链乘法问题
- web性能测试需求分析(一)
- oracle中varchar2转clob的替代方案
- 采集温度,如何处理小数点算法思路
- 小小有感。。
- Hadoop 多表 join:map side join 范例