题意:
给你一串数,问你是否是一个二叉搜索树或者是镜像的先序遍历。
如果是,就输出这棵树的后序遍历。
题解:
根据二叉搜索树的性质,模拟判断一下。
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 i=r,j=l+1; 14 if(ismirror) 15 { 16 while(i>l&&pre[l]>pre[i])i--; 17 while(j<=r&&pre[l]<=pre[j])j++; 18 }else 19 { 20 while(i>l&&pre[l]<=pre[i])i--; 21 while(j<=r&&pre[l]>pre[j])j++; 22 } 23 if(j-i!=1)return; 24 dfs(l+1,i),dfs(j,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]," \n"[i==n-1]); 43 }else puts("NO"); 44 return 0; 45 }
时间: 2024-10-08 10:27:44