題意 給你一個樹的中序遍歷和後序遍歷 某個節點的權值為從根節點到該節點所經過節點的和 求權值最小的葉節點的值 如果存在多個 輸出值最小的那個
把樹建好就好說了 遞歸遞歸dfs msun保存最小葉節點權值 ans保存答案
#include#include #include using namespace std; const int maxn = 10005, INF = 0x3f3f3f3f; int in[maxn], post[maxn], msum, ans; struct node { int val; node *left, *right; node(): left(NULL), right(NULL) {} }; node* build(int le, int ri, int pos) { node *cur = new node; cur->val = post[pos]; if(le == ri) return cur; int i = le; while(in[i] != post[pos]) ++i; if(i == le) cur->left = NULL; else cur->left = build(le, i - 1, pos - 1 - (ri - i)); if(i == ri) cur->right = NULL; else cur->right = build(i + 1, ri, pos - 1); return cur; } void dfs(node *cur, int sum) { int t = cur->val; if(!(cur->left || cur->right)) { if(sum + t < msum || (sum + t == msum && t < ans)) msum = sum + t, ans = t; } if(cur->left != NULL) dfs(cur->left, sum + t); if(cur->right != NULL) dfs(cur->right, sum + t); } int main() { char s[maxn*10]; while(gets(s) != NULL) { int t = 0, l = 0; for(int i = 0; s[i] != '\0'; ++i) if(isdigit(s[i])) t = t * 10 + s[i] - '0'; else in[++l] = t, t = 0; in[++l] = t; gets(s); l = t = 0; for(int i = 0; s[i] != '\0'; ++i) if(isdigit(s[i])) t = t * 10 + s[i] - '0'; else post[++l] = t, t = 0; post[++l] = t; node *root = build(1, l, l); ans = msum = INF; dfs(root, 0); printf("%d\n", ans); } return 0; }
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.
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
1 3 255
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.
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
1 3 255