地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805440976633856
其实我比较喜欢简洁高效的代码,感觉这道题要分开考虑二叉搜索树和其镜像树;比较麻烦,需要多情况考虑,但网上看了一下别人写的,确实简洁不少;
用一个vis确定是二叉搜索树还是其镜像树;
然后递归搜索其子树即可;
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
#define mp make_pair
#define pb push_back
#define fi first
#define se second
const int N = 1005;
int n;
bool flag = false;
int a[N];
vector<int>ve;
void build(int l,int r,int vis)
{
if(l > r || flag) return ;
if(l == r){
ve.pb(a[l]);
return ;
}
int k = r + 1;
for(int i = l + 1;i <= r;++i){
if(a[i] < a[l] && vis) continue;
if(a[i] >= a[l] && !vis) continue;
k = i;
break;
}
for(int i = k;i <= r;++i){
if(a[i] < a[l] && vis) flag = true;
if(a[i] >= a[l] && !vis) flag = true;
}
if(flag) return ;
build(l + 1,k - 1,vis);
build(k,r,vis);
ve.pb(a[l]);
}
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i){
scanf("%d",&a[i]);
}
int vis = (a[2] < a[1]) ? 1 : 0;
flag = false;
build(1,n,vis);
if(flag){
cout << "NO" << endl;
return 0;
}else{
cout << "YES" << endl;
int len = ve.size();
for(int i = 0;i < len;++i){
if(i == len - 1){
printf("%d\n",ve[i]);
}else{
printf("%d ",ve[i]);
}
}
}
return 0;
}