You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root of the binary tree to any leaf. The value of a path is the sum of values of nodes along that path.
Input
The input file will contain a description of the binary tree given as the inorder and postorder traversal sequences of that tree. Your program will read two line (until end of file) from the input file. The first line will contain the sequence of values associated with an inorder traversal of the tree and the second line will contain the sequence of values associated with a postorder traversal of the tree. All values will be different, greater than zero and less than 10000. You may assume that no binary tree will have more than 10000 nodes or less than 1 node.
Output
For each tree description you should output the value of the leaf node of a path of least value. In the case of multiple paths of least value you should pick the one with the least value on the terminal node.
Sample Input
3 2 1 4 5 7 6
3 1 2 5 6 7 4
7 8 11 3 5 16 12 18
8 3 11 7 16 18 12 5
255
255
Sample Output
1
3
255
题目大意:
给定一棵二叉树的中序和后序遍历序列,找到一个叶子结点使得它到根的路径上的权和最小,如果有多解,该叶子结点本身的权值应该尽量小。
解题思路:
中后序建树+DFS
AC代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 10005
#define INF 0x3f3f3f3f
struct node {
node *left;
node *right;
int c;
}tree[maxn];//静态内存分配数组
int num1[maxn]; int num2[maxn];
int cnt;//静态数组中已经分配的结点个数
node *creat() {//申请一个结点空间,返回指向其的指针
tree[cnt].left = tree[cnt].right = NULL;//初始化左右儿子为空
return &tree[cnt++];//返回指针,且计数器累加
}
node *build(int s1, int e1, int s2, int e2) {//由字符串的中序遍历和后序遍历还原树
node *ret = creat();//为树的根结点申请空间
ret->c = num2[e2];
int rootidx;
for (int i = s1; i <= e1; i++) {//查找该根结点字符在中序遍历中的位置
if (num1[i] == num2[e2]) {
rootidx = i;
break;
}
}
if (rootidx != s1) {//若左子树不为空
ret->left = build(s1, rootidx - 1, s2, s2 + rootidx - s1 - 1);//递归还原左子树
}
if (rootidx != e1) {//若右子树不为空
ret->right = build(rootidx + 1, e1, s2 + rootidx - s1, e2 - 1);//递归还原右子树
}
return ret;
}
int best, best_sum;
void dfs(node *t, int sum) {
sum += t->c;
if (t->left == NULL&&t->right == NULL) {//叶子结点
if (sum == best_sum) {
best = min(best, t->c);
}
else if (sum < best_sum) {
best_sum = sum;
best = t->c;
}
return;
}
if (t->left != NULL) {//左子树不为空
dfs(t->left, sum);
}
if (t->right != NULL) {//右子树不为空
dfs(t->right, sum);
}
}
int main() {
while (scanf("%d",&num1[0]) != EOF) {
best = maxn; best_sum = INF;
int k1 = 1, k2 = 0;
while (true) {
char ch = getchar();
if (ch == '\n')break;
scanf("%d", &num1[k1++]);
}
while (true) {
scanf("%d", &num2[k2++]);
char ch = getchar();
if (ch == '\n')break;
}
cnt = 0;//将静态内存空间中已经使用的结点个数初始化为0
node *t = build(0, k1 - 1, 0, k2 - 1);
dfs(t, 0);
cout << best << endl;
}
return 0;
}