树

#include<cstdio> #include<iostream> #include<algorithm> #include<sstream> using namespace std; const int maxn = 100005; int LT[maxn], RT[maxn]; int middle[maxn], behind[maxn]; int n,mini; int read_per(int *a) { string s; getline(cin, s); stringstream ss(s); int x; n = 0; while (ss >> x)a[n++] = x; return n > 0; } //构造二叉树 int bulid(int L1,int R1,int L2,int R2) { if (L1 > R1) return 0; int root = behind[R2]; int p = L1; while (root != middle[p])p++; int cnt = p - L1; LT[root] = bulid(L1, p - 1, L2, L2 + cnt - 1);//递归赋值 RT[root] = bulid(p + 1, R1, L2 + cnt, R2- 1); return root;//每次返回root值说明该位置的一个子节点是root } //最小权和 int best; void dfs(int u, int sum) { sum += u; if (!RT[u] && !LT[u]) { if (mini > sum||(sum == mini&&u<best)) { best = u; mini = sum; } return; } if(LT[u])dfs(LT[u], sum);//一个结点有值,一个节点无值时可以判断 if(RT[u])dfs(RT[u], sum); } int main(void) { while (read_per(middle)) { read_per(behind); mini = 999999; bulid(0, n - 1, 0, n - 1); dfs(behind[n - 1], 0); cout << best << endl; } return 0; }
计算机小白记录学习过程,喜欢就点个推荐和关注吧O(∩_∩)O哈哈~

浙公网安备 33010602011771号