UVa 548 -- Tree

UVa 548 - Tree

给你一棵树的中根序和后根序遍历,求从根到叶子组成的路径中数字和最小的那条。

分析:DFS,树,递归。直接递归求解,用全局变量更新即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<sstream>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn = 10000 + 5;
 7 int in_list[maxn];///中序序列
 8 int post_list[maxn];///后序序列
 9 int ans;
10 int ans_node;
11 int list_len;
12 ///按行读取输入结点序列
13 bool read_list(int *a)
14 {
15     string line;
16     if(!getline(cin,line)) return false;
17     stringstream ss(line);
18     int n=0;
19     int x;
20     while(ss >> x) a[n++] = x;
21     list_len = n;
22     return n > 0;
23 }
24 
25 void bfs(int *in,int *post,int n,int sum)
26 {
27     if(n <= 0) return;
28     if(n == 1)///到达叶子节点
29     {
30         ///更新解
31         if(ans > sum+post[n-1])
32         {
33             ans = sum+post[n-1];ans_node = post[n-1];
34         }
35         ///相等的情况
36         else if(ans == sum+post[n-1] && post[n-1]<ans_node)
37         {
38             ans = sum+post[n-1];ans_node = post[n-1];
39         }
40         return;
41     }
42     int root = post[n-1];
43     int p = 0;
44     while(in[p] != root) p++;
45     //进入子树之前sum加上当前根节点的值
46     sum += root;
47     bfs(in,post,p,sum);///左子树
48     bfs(in+p+1,post+p,n-p-1,sum);///右子树
49 }
50 
51 int main()
52 {
53     while(read_list(in_list))
54     {
55         read_list(post_list);
56         ans = 100000005;ans_node = 20000;
57         bfs(in_list,post_list,list_len,0);
58         cout<<ans_node<<endl;
59     }
60     return 0;
61 }

原文地址:https://www.cnblogs.com/yxh-amysear/p/8449294.html