复习一下,二叉搜索树的插入,也就是建树方式,然后一个是镜像树的前中后序遍历就是左右子树的顺序换了一下,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
struct node {
int data;
node *lchild, *rchild;
};
vi v, v1, v2, v3, v4;
void insert_t(node* &root, int x) {
if (root == NULL) {
root = new node;
root->data = x;
root->lchild = root->rchild = NULL;
return;
}
if (x < root->data) insert_t(root->lchild, x);
else insert_t(root->rchild, x);
}
void preorder(node* root) {
if (root == NULL) return;
v1.pb(root->data);
preorder(root->lchild);
preorder(root->rchild);
}
void preorder_m(node* root) {
if (root == NULL) return;
v2.pb(root->data);
preorder_m(root->rchild);
preorder_m(root->lchild);
}
void postorder(node* root) {
if (root == NULL) return;
postorder(root->lchild);
postorder(root->rchild);
v3.pb(root->data);
}
void postorder_m(node* root) {
if (root == NULL) return;
postorder_m(root->rchild);
postorder_m(root->lchild);
v4.pb(root->data);
}
void print(vi v) {
for (int i = 0; i < (int) v.size(); i++) {
cout << v[i] << (i < (int) v.size() - 1 ? " " : "");
}
}
int main() {
int n;
cin >> n;
node* root = NULL;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
v.pb(x);
insert_t(root, x);
}
preorder(root);
preorder_m(root);
postorder(root);
postorder_m(root);
if (v == v1) {
cout << "YES" << endl;
print(v3);
} else if (v == v2) {
cout << "YES" << endl;
print(v4);
} else cout << "NO";
return 0;
}