这道题目意思就是给你一棵树的中序和后序,然后根据这两个来建棵数,并求出数字和最小的那条路径的叶子是什么。
首先第一步肯定是要建树,是个标准建树。然后用dfs遍历并,遍历时要把父节点的值一路叠加下来,碰到叶子节点后,比较哪个最小,把节点的值保存下。。
AC代码:
#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
struct node {
int val;
int sum;
node* left;
node* right;
};
node* newnode() {
node* u = (node*)malloc(sizeof(node));
u -> left = u -> right = NULL;
return u;
}
node* creatnode(int* mid,int* post,int n) {
if (n == 0)
return NULL;
int i = n - 1;
for (;post[n - 1] != mid[i];i--);
node* u =newnode();
u -> val = post[n - 1];
u -> sum = post[n - 1];
u -> left = creatnode(mid ,post ,i);
u -> right = creatnode(mid + i + 1 ,post + i,n - i -1 );
return u;
}
int m = 1000;
int res;
int makesum(node* u , int sum) {
if (u -> left == NULL && u -> right == NULL) {
u -> sum = u -> sum +sum;
if (u -> sum < m) {
m = u -> sum;
res = u -> val;
}
return 0;
}
u -> sum = u -> sum + sum;
if (u -> right != NULL && u -> left != NULL) {
makesum(u -> left ,u -> sum);
makesum(u -> right , u -> sum);
return 0;
}
if (u -> left != NULL) {
makesum(u -> left ,u -> sum);
return 0;
}
if (u -> right != NULL) {
makesum(u -> right , u -> sum);
return 0;
}
}
int main () {
char ch;
int mid[10000];
int post[10000];
int i = 0;
int num;
while (scanf("%d",&num) != EOF) {
mid[i++] = num;
ch = getchar();
if (ch == '\n') {
for (int j = 0 ;j < i;j++)
scanf("%d",&post[j]);
node* u = creatnode(mid,post,i);
makesum(u ,u -> sum);
cout << res << endl;
m = 1000;
i = 0;
}
}
return 0 ;
}