UVA 548 树

xiaoxiao2021-02-28  111

这道题的关键字在于根据中序遍历和后序遍历建立出二叉树。另外在寻找路径时,可使用深度优先的方式搜索,搜索到叶子节点时加以判断即可。 这里用到sstream来读入,也是一个技巧,记录下来。 代码如下:

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<sstream> using namespace std; const int maxn = 10005; const int root = 1; int Left[maxn], Right[maxn]; int Value[maxn]; int ins[maxn], pos[maxn]; int n; int cnt; int bestSum = 1000000000; int best; bool getinput(int a[]){ string s; if (!getline(cin,s)) return false; stringstream ss(s); n = 0; int x; while (ss >> x){ a[n++] = x; } return true; } void newTree(){ cnt = 0; Left[root] = Right[root] = 0; Value[root] = -1; } int newNode(){ ++cnt; Left[cnt] = Right[cnt] = 0; Value[cnt] = -1; return cnt; } int build(int L1, int R1, int L2, int R2){ int t = 0; if (L1 <= R1){ int v = pos[R2]; t = newNode(); Value[t] = v; int i; for (i = L1; i <= R1; i++){ if (ins[i] == v) break; } int cnt = i - L1; Left[t] = build(L1, i - 1, L2, L2+cnt-1); Right[t] = build(i + 1, R1, L2 + cnt, R2-1); } return t; } void dfs(int p,int sum){ sum += Value[p]; if (!(Left[p] || Right[p])){ if (sum < bestSum || (sum == bestSum && Value[p] < best)){ best = Value[p]; bestSum = sum; } } else{ if (Left[p]) dfs(Left[p], sum); if (Right[p]) dfs(Right[p], sum); } } int main() { while (getinput(ins)){ getinput(pos); newTree(); build(0, n-1, 0, n-1); bestSum = 1000000000; best = 10000; dfs(root,0); cout << best << endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-30497.html

最新回复(0)