此题是PAT甲级1020题的拓展,与1020唯一的不同就是输出的不再是层序遍历,而是Z字形遍历,依题意为右->左->右…的次序,在1020的基础上更改BFS函数,设置一个flag实现每隔一层翻转一次原本正常的层序遍历即可得到Z字形遍历。
1020题代码点此跳转
#include <bits/stdc++.h>
using namespace std;
const int N = 40;
int n;
int in[N], post[N];
unordered_map<int, int> l, r, pos;
vector<int> ans;
int buildTree(int il, int ir, int pl, int pr)
{
int root = post[pr];
int k = pos[root];
if(k > il) l[root] = buildTree(il, k - 1, pl, k - 1 - il + pl);
if(k < ir) r[root] = buildTree(k + 1, ir, k - il + pl, pr - 1);
return root;
}
void bfs(int u)
{
queue<int> q;
q.push(u);
bool flag = true;
while(q.size())
{
int qSize = q.size();
for(int i = 0; i < qSize; i++)
{
auto t = q.front();
q.pop();
ans.push_back(t);
if(l.count(t)) q.push(l[t]);
if(r.count(t)) q.push(r[t]);
}
if(flag) reverse(ans.begin() + ans.size() - qSize, ans.end());
flag = !flag;
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> in[i];
pos[in[i]] = i;
}
for(int i = 0; i < n; i++) cin >> post[i];
int root = buildTree(0, n - 1, 0, n - 1);
bfs(root);
cout << ans[0];
for(int i = 1; i < ans.size(); i++) cout << ' ' << ans[i];
cout << endl;
}