题目大意:给出一棵树的中序遍历和后序遍历,要求你根据此得出从根节点到叶子节点路径上权值和最小时叶子节点的值
本题最简单的思路是先根据中序遍历和后序遍历构建出整棵树,然后再用深度优先搜索来确定叶子的值。
但我缺省掉了dfs的过程,再构建树的过程中完成统计并输出结果的值。下面附上我c语言的代码
这里只给出了单例的代码,如需符合多例,读者可自行修改!
#include <stdio.h>
int best = -1,best_sum;
int in[10000],post[10000],cnt = 0;
char str[60000];
int next(int pos){
int i;
for(i = pos;str[i] != '\0';i++){
if(str[i] < '0' || str[i] > '9')continue;
if(i - 1 < 0 || str[i - 1] == ' ')return i;
}
return -1;
}
void init(){
int i;
gets(str);
for(i = next(0);i != -1;i = next(i+1))
sscanf(str+i,"%d",&in[cnt++]);
cnt = 0;
gets(str);
for(i = next(0);i != -1;i = next(i+1))
sscanf(str+i,"%d",&post[cnt++]);
}
int find(int v){
int i;
for(i = 0;i < cnt;i++)
if(in[i] == v)return i;
return -1;
}
void build(int b1,int e1,int b2,int e2,int sum){//sum表示到目前位置的和为多少
if(b1 > e1 || b2 > e2)return;
int pos = find(post[e2]);
sum += post[e2];
if(b1 == e1){
if(best<0 || sum<best_sum || (sum == best_sum && post[e2]<best)){
best = post[e2];
best_sum = sum;
}
}
build(b1,pos-1,b2,b2+pos-b1-1,sum);
build(pos+1,e1,b2+pos-b1,e2-1,sum);
}
int main(){
init();
build(0,cnt-1,0,cnt-1,0);
printf("%d\n",best);
return 0;
}