Uva 548 Tree

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva 548 Tree相关的知识,希望对你有一定的参考价值。

0.这是一道利用中序遍历和后序遍历确定二叉树的题目,学会建树

关键点理解这段代码

int build(int L1,int R1,int L2,int R2)
{
    //printf("built:\n");
    if(L1>R1) return 0;//空树
    int root=post_order[R2];
    int p=L1;
    while(in_order[p] != root) p++;
    int  cnt = p-L1;//左子树的结点个数
    lch[root]=build(L1,p-1,L2,L2+cnt-1);
    rch[root]=build(p+1,R1,L2+cnt,R2-1);
    return root;
}

1.剩下的就是递归了 注意一下递归边界是  到达叶子结点 即左右子树均为空的结点 就行了

 if(!lch[v] && !rch[v])

 

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <sstream>
 5 #include <algorithm>
 6 using namespace std;
 7 const int maxn=10000 + 5;
 8 int post_order[maxn],in_order[maxn],lch[maxn],rch[maxn];
 9 int n,ans_sum,ans_v;
10 
11 bool input(int*a)
12 {
13     string s;
14     //getline(cin,s);
15     if(!getline(cin,s)) return false;
16     stringstream ss(s);
17     n=0;
18     int x;
19     while(ss>>x) a[n++]=x;
20     return n>0;
21 }
22 
23 int build(int L1,int R1,int L2,int R2)
24 {
25     //printf("built:\n");
26     if(L1>R1) return 0;//空树
27     int root=post_order[R2];
28     int p=L1;
29     while(in_order[p] != root) p++;
30     int  cnt = p-L1;//左子树的结点个数
31     lch[root]=build(L1,p-1,L2,L2+cnt-1);
32     rch[root]=build(p+1,R1,L2+cnt,R2-1);
33     return root;
34 }
35 void dfs(int v,int sum)
36 {
37     sum+=v;
38     if(!lch[v] && !rch[v])
39     {
40         if(sum < ans_sum)
41             ans_sum = sum,ans_v=v;
42         else if(sum == ans_sum && v < ans_v)
43             ans_v = v;
44     }
45     if(lch[v]) dfs(lch[v],sum);
46     if(rch[v]) dfs(rch[v],sum);
47 }
48 int  main()
49 {
50     while(input(in_order))
51     {
52         input(post_order);
53         build(0,n-1,0,n-1);
54         ans_sum=999999999;
55         dfs(post_order[n-1],0);
56         printf("%d\n",ans_v);
57     }
58     return 0;
59 }

 

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

Tree-UVA 548

Uva 548 Tree

UVA548 Tree

二叉树的递归遍历 Tree UVa548

UVA - 548 Tree(二叉树的递归遍历)

UVa536 - Tree Recovery