UVa 548 -- Tree

Posted Amysear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

 

以上是关于UVa 548 -- Tree的主要内容,如果未能解决你的问题,请参考以下文章

UVa 548 Tree (建树+前序后序)

树(Tree,UVA 548)

UVA548 Tree

UVa548 Tree (二叉树)

Tree-UVA 548

二叉树的递归遍历 Tree UVa548