建立两棵相反的BFS,然后遍历判断是否相同。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
struct Node{
Node *left;
Node *right;
int c;
}Tree[2002];
int loc;
Node *creat(){
Tree[loc].left=Tree[loc].right=NULL;
return &Tree[loc++];
}
Node *build_BST(Node *T,int x){
if(T==NULL){
T=creat();
T->c=x;
}
else{
if(x<T->c) T->left=build_BST(T->left,x);
else T->right=build_BST(T->right,x);
}
return T;
}
Node *build_BST_mirror(Node *T,int x){
if(T==NULL){
T=creat();
T->c=x;
}
else{
if(x<T->c) T->right=build_BST_mirror(T->right,x);
else T->left=build_BST_mirror(T->left,x);
}
return T;
}
void preOrder(Node *T,vector<int> &v){
v.push_back(T->c);
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->c);
}
vector<int> v,v1,v2,v3;
int n;
int main(){
scanf("%d",&n);
while(n--){
int tmp;
scanf("%d",&tmp);
v1.push_back(tmp);
}
Node *T1=NULL,*T2=NULL;
for(int i=0;i<v1.size();i++){
T1=build_BST(T1,v1[i]);
T2=build_BST_mirror(T2,v1[i]);
}
preOrder(T1,v2);
preOrder(T2,v3);
if(v2!=v1 && v3!=v1){
printf("NO\n");
return 0;
}
else{
printf("YES\n");
if(v2==v1){
postOrder(T1,v);
printf("%d",v[0]);
for(int i=1;i<v.size();i++)
printf(" %d",v[i]);
}else if(v3==v1){
postOrder(T2,v);
printf("%d",v[0]);
for(int i=1;i<v.size();i++)
printf(" %d",v[i]);
}
}
return 0;
}