左右视其实就是二叉树各层数的第一个和最后一个,所以根据中后序遍历下前序,声明个层数向量存每层的树节点就行,最后根据左右视输出每层的第一个和最后一个节点
#include<bits/stdc++.h>
typedef long long ll;
const int maxm = 1e5 + 5;
const int infmax = INT_MAX;
const int infmin = INT_MIN;
using namespace std;
int in[250], post[250], maxdepth = 0;
vector<int> v[250];
void pre(int root, int start, int end, int depth) {
if (start > end)
return;
maxdepth = max(maxdepth, depth);
int i = start;
while (i < end && in[i] != post[root]) i++;
v[depth].push_back(post[root]);
pre(root - 1 - (end - i), start, i - 1, depth + 1);
pre(root - 1, i + 1, end, depth + 1);
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> in[i];
for (int i = 1; i <= n; i++) cin >> post[i];
pre(n, 1, n, 1);
cout << "R:";
for (int i = 1; i <= maxdepth; i++) cout << ' ' << v[i].back();
cout << "\n";
cout << "L:";
for (int i = 1; i <= maxdepth; i++) cout << ' ' << v[i].front();
cout << "\n";
return 0;
}