7-10 树的遍历 (25分)
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<map> #include<queue> #include<iomanip> #include<stack> using namespace std; #define STDIN freopen("in.in", "r", stdin);freopen("out.out", "w", stdout); const int N = 10010; int back[N]; int mid[N]; int le[N], ri[N]; int n; int build(int l1, int r1, int l2, int r2) { if (l1 > r1) return 0; int rt = back[r1]; int j; for (int i = l2; i <= r2; i++){ if (mid[i] == rt){ j = i; break; } } int cnt = j - l2; le[rt] = build(l1,l1+cnt-1, l2, j-1); ri[rt] = build(l1+cnt, r1-1,j+1, r2); return rt; } int main() { STDIN cin >> n; for (int i = 1; i <= n; i++) cin >> back[i]; for (int i = 1; i <= n; i++) cin >> mid[i]; le[0] = build(1,n,1,n); queue<int> que; vector<int> ans; que.push(le[0]); while (que.size()) { auto t = que.front(); que.pop(); ans.push_back(t); if (le[t] > 0) que.push(le[t]); if (ri[t] > 0 ) que.push(ri[t]); } int len = ans.size(); for (int i = 0; i < len; i++) { printf("%d%c", ans[i], " \n"[i == len-1]); } return 0; }

浙公网安备 33010602011771号