题目大意:给树中序后续遍历,然后找出叶子节点到裉节点的和最小的,如果和相同就看哪个叶子节点数值小,就输出那个叶子节点的值。
解题思路:先利用中序后序建树,在遍历找和最小的。注意:释放叶子节点时,要赋值为NULL;否则指针就变成野指针了。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
const int N = 10005;
int str1[N], str2[N];
int min, depth;
struct tree {
int ch;
tree * left, *right;
tree(int c) {ch = c; left = right = NULL;}
} *head = NULL;
int find(int *p, int ch) {
for(int i = 0; p[i] != 0; i++)
if(*(p + i) == ch)
return i;
return -1;
}
void build (tree *&t, int *s1, int *s2, int len) {
if(len <= 0)
return;
t = new tree(*s2);
int p = find(s1, *s2);
build(t->right, s1 + p + 1, s2 - 1, len - p - 1);
build(t->left, s1, s2 - len + p, p);
}
void clear(tree *& p) {
if(p != NULL) {
clear(p->left);
clear(p->right);
delete(p);
p = NULL;
}
}
void print(tree *p, int d) {
if(p != NULL) {
d += p->ch;
if(p ->left == NULL && p->right == NULL) {
if(depth > d) {
depth = d;
min = p->ch;
}
else if(depth == d) {
if(min > p->ch)
min = p->ch;
}
return;
}
print(p->left, d);
print(p->right, d);
}
}
int main() {
char ch;
int i ;
while(scanf("%d%c", &str1[0], &ch) == 2) {
min = depth = 100000000;
for(i = 1; ch != '\n'; i++)
scanf("%d%c", &str1[i], &ch);
str1[i] = '0';
ch = '\0';
for(i = 0; ch != '\n'; i++)
scanf("%d%c", &str2[i], &ch);
str2[i] = 0;
build(head, str1, str2 + i - 1, i);
print(head, 0);
printf("%d\n", min);
clear(head);
head = NULL;
}
return 0;
}