pre不建树还原二叉树
#include <iostream>
#include <vector>
using namespace std;
vector<int> pre,post;
int n;
int isMirror=0;
void getPost(int root,int tail){
if(root>tail) return;
int i=root+1,j=tail;
if(!isMirror){
while(i<=tail && pre[i]<pre[root]) i++;//退出时是right第一个
while(j>root && pre[j]>=pre[root]) j--;//退出时是left最后一个
}else{
while(i<=tail && pre[i]>=pre[root]) i++;//退出时是right第一个
while(j>root && pre[j]<pre[root]) j--;//退出时是left最后一个
}
if(i-j!=1) return;//已经不符合BST了
getPost(root+1,j);//left
getPost(i,tail);//right
post.push_back(pre[root]);//root
}
int main(){
scanf("%d",&n);
pre.resize(n);
for(int i=0;i<n;i++) scanf("%d",&pre[i]);
getPost(0,n-1);
if(post.size()!=n){//MBST?
post.clear();
isMirror=1;
getPost(0,n-1);
}
if(post.size()==n){//BST and MBST
printf("YES\n");
for(int i=0;i<n;i++)
printf("%d%s",post[i],(i==n-1)?"\n":" ");
}else{
printf("NO\n");
}
return 0;
}