原题链接
思路:因为是前序遍历,所以对于区间[l, r],a[l]一定是根节点,[l + 1, r]是这棵数的左右子树的所有元素。找到分界点后递归即可。用vector存后续遍历的结果。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
vector<int> v;
int n, m;
int a[N];
int type;
void build(int l, int r) {
if (l > r) return ;
int sl = l + 1, sr = r;
if(type) {
while (sl <= r && a[sl] < a[l]) sl ++;
while (sr > l && a[sr] >= a[l]) sr --;
}
else {
while (sl <= r && a[sl] >= a[l]) sl ++;
while (sr > l && a[sr] < a[l]) sr --;
}
if (sl - sr != 1)return ;
build(l + 1, sr);
build(sl, r);
v.push_back(a[l]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
}
build(1, n);
if (v.size() < n) {
type = 1;
v.clear();
build(1, n);
}
if(v.size() != n) cout << "NO";
else {
cout << "YES" << endl;
bool flag = false;
for (auto t : v) {
if (flag) cout << ' ';
flag = 1;
cout << t;
}
}
return 0;
}