简单题。构造出二叉搜索树,然后check一下。
#include<stdio.h> #include<algorithm> using namespace std; const int maxn=100000+10; struct Node { int left; int right; int val; } s[maxn]; int n; int a[maxn]; int ans[maxn],tot; int h[maxn]; int k; void dfs(int x) { ans[k++]=s[x].val; if(s[x].left!=-1) dfs(s[x].left); if(s[x].right!=-1) dfs(s[x].right); } void houxu(int x) { if(s[x].left!=-1) houxu(s[x].left); if(s[x].right!=-1) houxu(s[x].right); h[k++]=s[x].val; } bool check() { for(int i=0;i<n;i++) if(ans[i]!=a[i]) return 0; return 1; } int main() { while(~scanf("%d",&n)) { for(int i=0; i<n; i++) scanf("%d",&a[i]); for(int i=0; i<=n; i++) s[i].left=s[i].right=-1; int id=0; s[id++].val=a[0]; for(int i=1; i<n; i++) { int now=0; while(1) { if(a[i]<s[now].val) { if(s[now].left!=-1) now=s[now].left; else { s[now].left=id; s[id++].val=a[i]; break; } } else { if(s[now].right!=-1) now=s[now].right; else { s[now].right=id; s[id++].val=a[i]; break; } } } } // for(int i=0;i<id;i++) printf("%d %d %d ",s[i].val,s[i].left,s[i].right); k=0; dfs(0); if(check()==1) { printf("YES "); k=0; houxu(0); for(int i=0;i<n;i++) { printf("%d",h[i]); if(i<n-1) printf(" "); else printf(" "); } continue; } k=0; for(int i=0;i<n;i++) swap(s[i].left,s[i].right); dfs(0); if(check()==1) { printf("YES "); k=0; houxu(0); for(int i=0;i<n;i++) { printf("%d",h[i]); if(i<n-1) printf(" "); else printf(" "); } continue; } printf("NO "); } return 0; }