#include <iostream> #include <vector> using namespace std; struct Node { Node *left, *right; int key; }node[2005]; int cnt = 0; Node *create() { node[cnt].left = node[cnt].right = nullptr; return &node[cnt++]; } Node *insert1(Node *T, int x) { if (T == nullptr) { T = create(); T->key = x; } else { if (x < T->key) T->left = insert1(T->left, x); else T->right = insert1(T->right, x); } return T; } Node *insert2(Node *T, int x) { if (T == nullptr) { T = create(); T->key = x; } else { if (x < T->key) T->right = insert2(T->right, x); else T->left = insert2(T->left, x); } return T; } void preOrder(Node *T, vector<int> &v) { v.push_back(T->key); if (T->left) preOrder(T->left, v); if (T->right) preOrder(T->right, v); } void postOrder(Node *T, vector<int> &v) { if (T->left) postOrder(T->left, v); if (T->right) postOrder(T->right, v); v.push_back(T->key); } int main() { int n; cin >> n; vector<int> v, v1, v2, vpost; int x; for (int i = 0; i < n; i++) { cin >> x; v.push_back(x); } cnt = 0; Node *T1 = nullptr, *T2 = nullptr; for (int i = 0; i < n; i++) { T1 = insert1(T1, v[i]); T2 = insert2(T2, v[i]); } preOrder(T1, v1); preOrder(T2, v2); if (v1 != v && v2 != v) { cout << "NO" << endl; return 0; } else { cout << "YES" << endl; if (v1 == v) postOrder(T1, vpost); else postOrder(T2, vpost); for (int i = 0; i < n; i++) cout << vpost[i] << (i - n + 1 ? ' ' : '\n'); } }