先序遍历都是(根,左子树,右子树),后序遍历改成(左子树,右子树,根)即可,判断是否为线序遍历和先序改为后序遍历都是用分治法。样例case都没问题但最后一个case没过,真奇怪。
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int>::iterator itr;
bool isbst(itr beg,itr end){
if(end-beg<=2)return true;
itr mid=find_if(beg+1,end,[&](int x)->bool{return x>=*beg;});
if(any_of(mid,end,[&](int x)->bool{return x<*beg;}))
return false;
return isbst(beg+1,mid)&&isbst(mid,end);
}
bool ismbst(itr beg,itr end){
if(end-beg<=2)return true;
itr mid=find_if(beg+1,end,[&](int x)->bool{return x<*beg;});
if(any_of(mid,end,[&](int x)->bool{return x>=*beg;}))
return false;
return ismbst(beg+1,mid)&&ismbst(mid,end);
}
void pre2post_bst(itr beg,itr end){
if(end-beg<=1)return;
itr mid=find_if(beg+1,end,[&](int x)->bool{return x>=*beg;});
pre2post_bst(beg+1,mid);
pre2post_bst(mid,end);
rotate(beg,beg+1,end);
}
void pre2post_mbst(itr beg,itr end){
if(end-beg<=1)return;
itr mid=find_if(beg+1,end,[&](int x)->bool{return x<*beg;});
pre2post_mbst(beg+1,mid);
pre2post_mbst(mid,end);
rotate(beg,beg+1,end);
}
int main(){
int n;cin>>n;
vector<int>val(n),ret;
for(auto &x:val)cin>>x;
if(isbst(val.begin(),val.end())){
pre2post_bst(val.begin(),val.end());
ret=val;}
if(ismbst(val.begin(),val.end())){
pre2post_mbst(val.begin(),val.end());
ret=val;
}
if(ret.size()){
bool first=true;
cout<<"YES"<<endl;
for(auto x:ret){
if(first)first=false;
else cout<<' ';
cout<<x;}
}else cout<<"NO"<<endl;
return 0;
}