您的位置:首页 > 其它

uva 548 - Tree 二叉树重构(中序和后序)+dfs

2016-08-22 10:44 465 查看
题目链接

思路:

后序遍历最后一个字符就是根,据此递归建树,再DFS一下。

#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<sstream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<climits>
#include<cctype>
#include<bitset>
#include<set>
using namespace std;
#define mod 1000000007
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
typedef long long LL;

const int maxv=10005;
int in_order[maxv],post_order[maxv],l[maxv],r[maxv];
int n;
bool read_list(int* a){
string line;
if(!getline(cin,line))return 0;
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 cnt=p-L1;
l[root]=build(L1,p-1,L2,L2+cnt-1);
r[root]=build(p+1,R1,L2+cnt,R2-1);
return root;
}
int best,best_sum;
void dfs(int u,int sum){
sum+=u;
if(!l[u]&&!r[u]){
if(sum<best_sum||(sum==best&&u<best)){
best=u;
best_sum=sum;
}
}
if(l[u])dfs(l[u],sum);
if(r[u])dfs(r[u],sum);;
}

int main()
{
while(read_list(in_order)){
read_list(post_order);
build(0,n-1,0,n-1);
best_sum=INF;
dfs(post_order[n-1],0);
cout<<best<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs uva 递归 遍历