uva_548-Tree
来源:互联网 发布:淘宝苹果电脑有假货吗 编辑:程序博客网 时间:2024/05/17 06:57
/**中序,后序建树,然后遍历,求根到叶子的最小和,输出 *该叶子节点,关于通过二叉树建树问题,本博客有相关讲述。。。 */#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct Node { int v; Node *lc, *rc;};#define MAX 10001#define MAXN 700001#define INF 0x7fffffffchar str1[MAXN], str2[MAXN];int order[MAX], post[MAX];int len, minv, ans;int find(int c, int pos, int n){ for(int i = pos; i <= n; i ++){ if( c == order[i] ) return i; } return -1;}void post_order_create_tree(Node *&root, int r, int m, int length){if( length <= 0 ) { root = NULL; return ;}root = new Node;root->v = post[r];int pos = find(post[r], m, length+m);int leftlen = pos - m;int rightlen = length - leftlen - 1;post_order_create_tree(root->lc, r-1-rightlen, m, leftlen); post_order_create_tree(root->rc, r-1, pos+1, rightlen);}void find_min(Node* root, int sum){ if( !root ) return; sum += root->v; if(!root->lc && !root->rc){ if(minv > sum){ minv = sum; ans = root->v; }else if( minv == sum ){ ans = min(ans, root->v); } return ; } find_min(root->lc, sum); find_min(root->rc, sum);}void print(Node *root){ if( !root ) return ; printf("%d ",root->v); print(root->lc); print(root->rc);}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGEfreopen("test.in", "r", stdin);//freopen("test.out", "w", stdout);#endif int length; Node *root;while( gets(str1) > 0){ gets(str2); length = 0; minv = ans = INF;for(int i = 0; str1[i] != '\0'; i ++){ if( str1[i] == ' ' ) { length ++; continue;} order[length] *= 10; order[length] += str1[i] - '0';}length = 0;for(int i = 0; str2[i] != '\0'; i ++){ if( str2[i] == ' ' ) { length ++; continue;} post[length] *= 10; post[length] += str2[i] - '0';}length ++;len = length;post_order_create_tree(root, length-1, 0, length); find_min(root, 0); printf("%d\n",ans); memset(order, 0, sizeof(int) * length); memset(post, 0, sizeof(int) * length);}return 0;}