题目大意:给出前序遍历和后序遍历, 求出树中根节点到叶节点的最短路径上叶节点的值, 如果有多条选叶节点最小的。
code:
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#define inf 0x7fffffff
using namespace std;
int ans = 0, Min = 0;
vector<int> V1, V2;
void build(int n, int s1, int s2, int sum)
{
if(n<=0) return ;
if(n == 1)
{
if(sum+V1[s1]<Min)
{
ans = V1[s1];
Min = sum+V1[s1];
}
if(sum+V1[s1] == Min && ans>V1[s1])
ans = V1[s1];
return ;
}
vector<int>::iterator it = find(V1.begin(), V1.end(), V2[s2]);
int s3 = it-V1.begin();//在中序树中的跟节点位置
sum += V2[s2];
build(s3-s1, s1, s2-(n-(s3-s1+1))-1, sum);
build(n-(s3-s1+1), s3+1, s2-1, sum);
}
int main()
{
int i = 0;
string s1, s2;
while(getline(cin, s1))
{
ans = 0;
Min = inf;
V1.clear(), V2.clear();
stringstream ss;
ss<<s1;
while(ss>>i) V1.push_back(i);
ss.clear();
getline(cin, s2);
ss<<s2;
while(ss>>i) V2.push_back(i);
build(V1.size(), 0, V1.size()-1, 0);
cout<<ans<<endl;
}
return 0;
}