方法:递归检测先序序列,是否满足排序二叉树的特性。
注意点:1,the mirror image of BST; 2,数值等于根节点的情况。
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int lchild,rchild,value;
};
int index=0,pre[1010],in[1010],num,tag=1;
node no[1010];
int createtree(int preL,int preR,int inL,int inR){
if(preL>preR) return -1;
int temp=index++,i;
no[temp].value=pre[preL];
if(tag==2){
for(i=inR;i>=inL;i--)
if(pre[preL]==in[i]) break;
}else{
for(i=inL;i<=inR;i++)
if(pre[preL]==in[i]) break;
}
no[temp].lchild=createtree(preL+1,preL+(i-inL),inL,i-1);
no[temp].rchild=createtree(preL+(i-inL)+1,preR,i+1,inR);
return temp;
}
bool judge(int L,int R){
if(L>=R) return true;
int i;
for(i=L+1;i<=R;i++)
if(pre[i]>=pre[L]) break;
for(int j=i;j<=R;j++)
if(pre[j]<pre[L]) return false;
return judge(L+1,i-1)&&judge(i,R);
}
bool judgemirror(int L,int R){
if(L>=R) return true;
int i;
for(i=L+1;i<=R;i++)
if(pre[i]<pre[L]) break;
for(int j=i;j<=R;j++)
if(pre[j]>=pre[L]) return false;
return judgemirror(L+1,i-1)&&judgemirror(i,R);
}
bool cmp(int a,int b){
if(tag==2) return a>b;
else return a<b;
}
int counta=0;
void postorder(int root){
if(root==-1) return;
postorder(no[root].lchild);
postorder(no[root].rchild);
counta++<num-1?printf("%d ",no[root].value):printf("%d",no[root].value);
}
int main(){
scanf("%d",&num);
for(int i=0;i<num;i++){
scanf("%d",&pre[i]);
in[i]=pre[i];
}
if(!judge(0,num-1)&&!judgemirror(0,num-1)){
printf("NO");
return 0;
}
printf("YES\n");
if(judgemirror(0,num-1)) tag=2;
sort(in,in+num,cmp);
int root=createtree(0,num-1,0,num-1);
postorder(root);
return 0;
}