题意:
给你一串数,问你是否是一个二叉搜索树或者是镜像的先序遍历。
如果是,就输出这棵树的后序遍历。
题解:
根据二叉搜索树的性质,模拟判断一下。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 const int N=1e4+7; 6 7 int n,ismirror; 8 vector<int>pre,ans; 9 10 void dfs(int l,int r) 11 { 12 if(r<l)return; 13 int b=l,c=r+1; 14 if(ismirror) 15 { 16 while(b<r&&pre[b+1]>=pre[l])b++; 17 while(c>l+1&&pre[c-1]<pre[l])c--; 18 }else 19 { 20 while(b<r&&pre[b+1]<pre[l])b++; 21 while(c>l+1&&pre[c-1]>=pre[l])c--; 22 } 23 if(c-b!=1)return; 24 dfs(l+1,b),dfs(c,r); 25 ans.push_back(pre[l]); 26 } 27 28 int main() 29 { 30 scanf("%d",&n); 31 F(i,1,n) 32 { 33 int x; 34 scanf("%d",&x); 35 pre.push_back(x); 36 } 37 dfs(0,n-1); 38 if(ans.size()!=n)ismirror=1,ans.clear(),dfs(0,n-1); 39 if(ans.size()==n) 40 { 41 puts("YES"); 42 for(int i=0;i<n;i++)printf("%d%c",ans[i]," "[i==n-1]); 43 }else puts("NO"); 44 return 0; 45 }