前序,中序建树,然后遍历
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 700001
#define MAXCNT 10001
#define INF 0x3f3f3f3f
char str[MAXN];
int rst, ans, in_cnt, post_cnt;
int in_order[MAXCNT], post_order[MAXCNT];
typedef struct BTREENODE_ {
int data;
struct BTREENODE_ *left_child;
struct BTREENODE_ *right_child;
}BTREENODE;
void deal(int *order, int &order_cnt)
{
int pos(0);
char num[MAXCNT/100];
for(int i = 0; '\0' != str[i]; i ++) {
if( isdigit(str[i]) ) {
num[pos ++] = str[i];
}
else {
num[pos] = '\0'; pos = 0;
sscanf(num, "%d", &order[order_cnt ++]);
}
}
num[pos] = '\0'; sscanf(num, "%d", &order[order_cnt ++]);
}
int get_index(const int &start, const int &final, const int &key_val)
{
for(int i = start; i <= final; i ++) {
if( in_order[i] == key_val ) {
return i;
}
}
return -1;
}
void build_binary_tree(const int &in_start, const int &in_final, BTREENODE **node)
{
post_cnt --; (*node) = new BTREENODE; (*node)->data = post_order[post_cnt];
int idx( get_index(in_start, in_final, post_order[post_cnt]) );
if( in_start == in_final ) {
(*node)->left_child = (*node)->right_child = NULL; return;
}
if( idx == in_start ) {
(*node)->left_child = NULL;
build_binary_tree(idx+1, in_final, &(*node)->right_child); return;
}
else if( idx == in_final ) {
(*node)->right_child = NULL;
build_binary_tree(in_start, idx-1, &(*node)->left_child); return;
}
build_binary_tree(idx+1, in_final, &(*node)->right_child);
build_binary_tree(in_start, idx-1, &(*node)->left_child);
}
void pre_order(BTREENODE *node, int cur_sum)
{
if( NULL == node ) {
return;
}
cur_sum += node->data;
if( NULL == node->left_child && NULL == node->right_child ) {
if( cur_sum == rst ) {
ans = min(ans, node->data);
}
else if( cur_sum < rst ) {
rst = cur_sum; ans = node->data;
}
}
pre_order(node->left_child, cur_sum); pre_order(node->right_child, cur_sum);
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in","r", stdin);
#endif
BTREENODE *root;
while( gets(str) > 0 ) {
in_cnt = post_cnt = 0; deal(in_order, in_cnt);
gets(str); deal(post_order, post_cnt);
rst = ans = INF; build_binary_tree(0, in_cnt-1, &root);
pre_order(root, 0); printf("%d\n", ans);
}
return 0;
}
uva_548_Tree
最新推荐文章于 2015-10-08 11:35:51 发布