题意:
根据二叉树中序和后序建立二叉树,从根结点开始计算和到叶子结点,输出总和最小的叶子结点,如果有俩个和一样大,输出叶子结点最小的
AC:80ms
#include<stdio.h> #include<iostream> #include <strstream> #include<string> #include<memory.h> #include<sstream> using namespace std; struct Tree { int curTotal; Tree() { curTotal = 0; } }; void buildTree(const int* in, const int* post, int curTotal, int* minTotal, int tl, int * leaf); int readInt(string str, int * const a) { istringstream in(str); int i; int total = 0; while (in >> i) a[total++] = i; return total; } int main() { //freopen("d:\1.txt", "r", stdin); string str1, str2; while (getline(cin, str1)) { getline(cin, str2); int inorder[100000]; int postorder[100000]; int tl = readInt(str1, inorder); readInt(str2, postorder); int min = 0x7FFFFFFF; int leaf = 0x7FFFFFFF; buildTree(inorder, postorder, 0, &min, tl, &leaf); cout << leaf << endl; } } void buildTree(const int* in, const int* post, int curTotal, int* minTotal, int tl, int * leaf) { if (tl == 0) return; int cur = -1; for (int i = 0; i < tl; i++) { if (in[i] == post[tl - 1]) { cur = i; break; } } //左孩子长度cur int left = cur; //right长度 tl-cur-1 int right = tl - cur - 1; curTotal += in[cur]; if (tl == 1) { if (curTotal <= *minTotal) { *minTotal = curTotal; *leaf = in[cur]; } } //left buildTree(in, post, curTotal, minTotal, left, leaf); //right buildTree(in + left + 1, post + left, curTotal, minTotal, right, leaf); }