首页 > 代码库 > Tree
Tree
uva548:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=489
题意:给出一颗二叉树的中序遍历和后序遍历,求一条路径,这条路径从根到叶子节点之和最小,然后输出叶子节点的值,如果最小和有多种情况时候,取叶子节点的最小值。
题解:知道二叉树的遍历,在建树的过程中,到达叶子节点的时候就处理,更新sum,即可。
1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstdio> 7 #include<cstring> 8 #define inf 1000000000 9 using namespace std;10 struct TreeNode{11 struct TreeNode* left;12 struct TreeNode* right;13 int elem;14 };15 int ans=inf,ans2,len,top1,tp;;16 int af[10002],in[10002];17 char c;18 TreeNode * build(int *in, int *pos, int len,int sum){19 if (len == 0)20 return NULL;21 int i = len - 1;22 while (pos[len - 1] != in[i])23 -- i;24 TreeNode *h =new TreeNode();25 h -> elem= pos[len-1];26 sum+= h -> elem;27 h -> left = build(in, pos, i,sum);//注意这里的处理28 h ->right = build(in + i + 1, pos + i, len - i - 1,sum);29 if(h->left==NULL&&h->right==NULL){30 if(sum<ans){31 ans=sum;32 ans2=h->elem;33 }34 else if(sum==ans){35 ans2=min(ans2,h->elem);36 }37 }38 return h;39 }40 int main(){41 while(~scanf("%d%c",&tp,&c)){42 memset(af,0,sizeof(af));43 memset(in,0,sizeof(in));44 in[0]=tp;top1=0;45 ans2=ans=inf;46 if(c==‘\n‘){47 scanf("%d%c",&tp,&c);48 af[0]=tp; len=1;49 }50 else{51 while(~scanf("%d%c",&tp,&c)){52 in[++top1]=tp;53 if(c==‘\n‘)break;54 }55 len=top1+1;56 for(int i=0;i<=top1;i++)57 scanf("%d",&af[i]);58 }59 build(in, af, len,0);60 printf("%d\n",ans2);61 }62 return 0;63 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。