UVa548_DFS_二叉树(由中序后续确定树并深搜)经典例子

来源:互联网 发布:海马玩模拟器 mac 编辑:程序博客网 时间:2024/05/18 08:15
#include<bits/stdc++.h>using namespace std;const int maxv = 10000+10;int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];int n;bool read_list(int* a) {string line;if(!getline(cin, line)) return false;stringstream ss(line);n = 0;int x;while(ss >> x) a[n++] = x;// ss -> xreturn n > 0;}//把in_order[L1..R1]和post_order[L2..R2],建成一棵二叉树然后返回int build(int L1, int R1, int L2, int R2){if(L1 > R1) return 0;int root = post_order[R2];int p = L1;while(in_order[p] != root) p++;int cnt = p-L1;lch[root] = build(L1, p-1, L2, L2+cnt-1);//左子节点 rch[root] = build(p+1, R1, L2+cnt, R2-1);//右子节点 return root;}int best, best_sum;//目前为止的最优解和对应的权和 void dfs(int u, int sum) {sum+=u;if(!lch[u] && !rch[u]) { //是叶子节点(值为0) if(sum < best_sum || (sum == best_sum && u < best)){best = u; best_sum = sum;} }if(lch[u]) dfs(lch[u], sum);if(rch[u]) dfs(rch[u], sum);}int main(){while(read_list(in_order)){read_list(post_order);build(0, n-1, 0, n-1);best_sum = 1000000000;dfs(post_order[n-1], 0);cout << best << endl;}return 0;} 

1 0
原创粉丝点击