L2-3 这是二叉搜索树吗?
Time limit:400ms
Memory limit:64MB
后续更新思路,要熄灯了。。。。
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int x[1005];
int n;
bool flag = 1; //标记目前正在尽情
int f1,f2;
vector<int> v; //存储后序遍历
void check(int l,int r){
if(l > r)
return;
f1 = l + 1,f2 = r;
if(!flag){ //非镜像
while(f1 <= r && x[f1] < x[l]) ++f1;
while(f2 > l && x[f2] >= x[l]) --f2;
}
else{ //镜像
while(f1 <= r && x[f1] >= x[l]) ++f1;
while(f2 > l && x[f2] < x[l]) --f2;
}
--f1;
++f2;
if(f2 - f1 != 1 && l != r)
return;
check(l + 1,f1);
check(f2,r);
v.push_back(x[l]);
}
signed main(){
cin>>n;
for(int i = 1;i <= n;++i)
cin>>x[i];
check(1,n); //检查非镜像是否合理
if(v.size() != n) //非镜像不合理则检查镜像情况
v.clear(),flag = false,check(1,n);
if(v.size() == n){ //合理则输出
cout<<"YES\n"<<v[0];
for(int i = 1;i < v.size();++i)
cout<<" "<<v[i];
}
else
cout<<"NO";
return 0;
}