Tree UVA - 548(二叉树递归遍历)
题目链接:https://vjudge.net/problem/UVA-548
题目大意:给一颗点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序遍历和后序遍历,找一个叶子结点使得它到根的路径上的权值和最小。如果有多个解,该叶子本身的权值应尽量小。输入中每两行表示一棵树,其中第一行为中序遍历,第二行为后续遍历。
看代码:
#include<iostream> #include<string.h> #include<stdio.h> #include<vector> #include<queue> #include<sstream> using namespace std; const int maxv=10000+5; int in_order[maxv],post_order[maxv],lch[maxv],rch[maxv]; int n; int best,best_sum;//目前为止最优解和对应的权值和 bool read_list(int *a) { string line; if(!getline(cin,line)) return false;//文件结束 stringstream ss(line); n=0; int x; while(ss>>x) a[n++]=x;//应用字符串流进行输入 return n>0; } int build(int L1,int R1,int L2,int R2) { if(L1>R1) return 0;//空树 int root=post_order[R2];//后序遍历最后一个结点就是树根 int p=L1; while(in_order[p]!=root) p++;//在中序遍历中找到根结点所在的位置 int cnt1=p-L1;//左子树结点的个数 lch[root]=build(L1,p-1,L2,L2+cnt1-1); rch[root]=build(p+1,R1,L2+cnt1,R2-1); return root; } void dfs(int u,int sum) { sum+=u; if(!lch[u]&&!rch[u])//代表叶子结点 { if(sum<best_sum||(sum==best_sum&&u<best)) { best=u; best_sum=sum; } } if(lch[u]) dfs(lch[u],sum); if(rch[u]) dfs(rch[u],sum); } int main() { while(read_list(in_order)) { read_list(post_order); build(0,n-1,0,n-1); best_sum=1000000000; dfs(post_order[n-1],0); cout<<best<<endl; } return 0; }
当初的梦想实现了吗,事到如今只好放弃吗~