先序遍历都是(根,左子树,右子树),后序遍历改成(左子树,右子树,根)即可,判断是否为线序遍历和先序改为后序遍历都是用分治法。样例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; }