题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192
#include<bits/stdc++.h> using namespace std; const int maxn = 1009; vector<int> v1,v2,v3; int a[maxn]; int tot; int n; struct tree { int num,left,right; }tr[maxn << 2]; void init() { tot = 0; memset(tr,0,sizeof(tr)); } void ins(int cur,int x) { if(x < tr[cur].num) { if(tr[cur].left == 0) { tr[cur].left = ++tot; tr[tot].num = x; }else ins(tr[cur].left,x); } else { if(tr[cur].right == 0) { tr[cur].right = ++tot; tr[tot].num = x; }else ins(tr[cur].right,x); } } void push(int x) { if(tot == 0) tr[++tot].num = x; else ins(1,x); } void dfs1(int cur = 1) { if(cur <= 0 || cur > tot) return; v1.push_back(tr[cur].num); dfs1(tr[cur].left); dfs1(tr[cur].right); } void dfs2(int cur = 1) { if(cur <= 0 || cur > tot) return; v2.push_back(tr[cur].num); dfs2(tr[cur].right); dfs2(tr[cur].left); } bool check(vector<int> &v) { for(int i = 1;i <= n;i++) { if(v[i-1] != a[i]) return false; } return true; } void last_s1(int cur = 1) { if(cur <= 0 || cur > tot) return; last_s1(tr[cur].left); last_s1(tr[cur].right); v3.push_back(tr[cur].num); } void last_s2(int cur = 1) { if(cur <= 0 || cur > tot) return; last_s2(tr[cur].right); last_s2(tr[cur].left); v3.push_back(tr[cur].num); } int main() { init(); scanf("%d",&n); for(int i = 1;i <= n;i++) { scanf("%d",&a[i]); push(a[i]); } v1.clear(); v2.clear(); dfs1();/**for(int i = 0;i < n;i++) printf("v1[%d] = %d, ",i,v1[i]);printf("\n");*/ dfs2();/**for(int i = 0;i < n;i++) printf("v2[%d] = %d, ",i,v2[i]);printf("\n");*/ v3.clear(); if(check(v1)) last_s1(); else if(check(v2)) last_s2(); else { printf("NO\n"); return 0; } printf("YES\n");/**for(int i = 0;i < n;i++) printf("v3[%d] = %d, ",i,v3[i]); printf("\n");*/ for(int i = 0;i < n;i++) { printf("%d",v3[i]); if(i != n-1) printf(" "); else printf("\n"); } }