UVa:548 Tree
2013-12-18 17:18
260 查看
这个题跪了好多次居然都是因为读错题了。
它要求在某条路径最小的情况下的叶结点的值。如果存在多条最小路径,则取最小的叶结点。
后序的最后一个结点是根节点。在中序序列中找到该结点的位置,右边是右子树,左边是该结点的左子树。注意要先递归右子树。
直接用后序和中序推出一个树的遍历过程,然后求就行了。用不着建树。
它要求在某条路径最小的情况下的叶结点的值。如果存在多条最小路径,则取最小的叶结点。
后序的最后一个结点是根节点。在中序序列中找到该结点的位置,右边是右子树,左边是该结点的左子树。注意要先递归右子树。
直接用后序和中序推出一个树的遍历过程,然后求就行了。用不着建树。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #define MAXN 10005 using 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 =temp; hash_mid[mid ]=n; n++; if(c!='\n') { while(scanf("%d%c",&mid ,&c)) { hash_mid[mid ]=n; n++; if(c=='\n') break; } } n=0; while(scanf("%d%c",&rear ,&c)) { n++; if(c=='\n') break; } minn=10000*10000; pos=n; ans=MAXN; solve(0,n-1,0); printf("%d\n",ans); } return 0; }
相关文章推荐
- Uva548——Tree
- UVA 548 Tree
- 例题6-8 树 Tree UVa 548 中序遍历+后序遍历建树
- 548 - Tree (UVa OJ)
- Tree UVA - 548
- Uva - 548 - Tree
- uva 548 - Tree
- uva 548 tree
- uva 548 Tree
- 例题6-8 UVa548 Tree(树的遍历转换)
- UVA 548 tree
- uva 548 tree(中序后序还原树)
- uva 548 tree 二叉树的各种遍历
- Uva - 548 - Tree
- Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。
- UVA - 548 Tree
- uva548 tree
- UVA - 548 Tree
- UVA - 548 Tree
- uva 548 -Tree