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 }
View Code

posted on 2014-07-17 10:56  天依蓝  阅读(134)  评论(0编辑  收藏  举报

导航