#include<bits/stdc++.h>
using namespace std;
vector<int>temp;
struct node{
int data;
node*l,*r;
};
int top,ttop;
int f;
void Swap(node *root){
  if(root){
     Swap(root->l);
     Swap(root->r);
     swap(root->l,root->r);
  }
}
node* build(node* root,int num){
   if(root==NULL){
       node*p = new node;
       p->data = num;
       p->l = NULL;
       p->r = NULL;
       return p;
   }
   if(num<root->data){
      root->l = build(root->l,num);
   }
   else{
      root->r = build(root->r,num);
   }
   return root;
}
void xian(node*root){
   if(root&&f){
      if(root->data!=temp[top++])f =0;
      xian(root->l);
      xian(root->r);
   }
}
void hou(node*root){
   if(root){
     hou(root->l);
      hou(root->r);
      if(ttop)ttop =0;
      else printf(" ");
     printf("%d",root->data);
   }
}
int main(int argc, char* argv[])
{
    int n;
    cin>>n;
    node *root = NULL;
    for(int i=1;i<=n;i++){
        int num;
        cin>>num;
        temp.push_back(num);
        root = build(root,num);
    }
     f = 1;
        top = 0;
        xian(root);
        if(!f){
            f = 1;
            top =0;
            Swap(root);
            xian(root);
        }
        if(f){
            printf("YES\n");
            ttop  =1;
            hou(root);
        }
        else printf("NO\n");
    return 0;
}数组模拟:17分
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int a[2000000],top;
int b[2000000];
vector<int>ans;
void Insert(int root,int num)
{
    if(a[root]==-1)
    {
        a[root] = num;
        return;
    }
    if(num<a[root])
        Insert(root*2,num);
    else
    {
        Insert(root*2+1,num);
    }
}
//void cc(int root){
//
//  queue<int>o;
//  o.push(root);
//  while(!o.empty()){
//
//    int y = o.front();
//    o.pop();
//    cout<<a[y]<<" ";
//    if(a[y*2]!=-1)
//    o.push(y*2);
//    if(a[y*2+1]!=-1)
//    o.push(y*2+1);
//  }
//}
void cc(int y)
{
    if(a[y]==-1)return;
    ans.push_back(a[y]);
    if(a[y*2]!=-1)
        cc(y*2);
    if(a[y*2+1]!=-1)
        cc(y*2+1);
}
void S(int y)
{
    if(a[y]==-1)return;
    S(y*2);
    S(y*2+1);
    swap(a[y*2],a[y*2+1]);
}
void hou(int y)
{
    if(a[y]==-1)return;
    if(a[y*2]!=-1)
        hou(y*2);
    if(a[y*2+1]!=-1)
        hou(y*2+1);
    if(top)top =0;
    else printf(" ");
    cout<<a[y];
}
int main()
{
    int n;
    cin>>n;
    memset(a,-1,sizeof a);
    memset(b,-1,sizeof b);
    int f =0;
    for(int i=1; i<=n; i++)
    {
        int num;
        cin>>num;
        b[i-1] = num;
        Insert(1,num);
    }
    cc(1);
    int u = 1;
    for(int i=0;i<n;i++){
        if(ans[i]!=b[i]){
            u =0;
        }
    }
    if(u==1)f = 1;
    if(!f){
         S(1);
    ans.clear();
    cc(1);
    u = 1;
    for(int i=0;i<n;i++){
        if(ans[i]!=b[i]){
            u =0;
        }
    }
    if(u==1)f = 1;
    }
  //  printf("\n");
    if(f)
    {
        printf("YES\n");
        top = 1;
        hou(1);
    }
    else printf("NO\n");
//    int m;
//    cin>>m;
//    for(int I=1;I<=m;I++){
//
//        int a1;
//        string ta;
//        cin>>a1>>t1;
//        if(t1=="is"){
//
//            cin>>t1>>t1;
//            if(t1=="root"){
//
//                if(mp)
//            }
//        }
//    }
    return 0;
}