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的主要内容,如果未能解决你的问题,请参考以下文章