#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> v1;
int n;
struct node {
int data;
//int layer; //【如果有要求层次信息的话】
node* lchild;
node* rchild;
};
node* newNode (int v)
{
node* Node = new node;//申请一个node型变量的空间
Node->data = v;
Node->lchild = NULL;
Node->rchild = NULL;
return Node;
}
void insert (node* &root, int x) //插入之后树的形状变了,所以要加一个引用&
{
if( root == NULL ){
root = newNode(x);
return; //真正有用的递归出口,把新节点插入到一个空位置上。
}
//if(x == root->data)
//return;
else if(x < root->data){
insert(root->lchild, x);
}
else/*按照规则插入到右边*/
insert(root->rchild,x);
}
node* Create(vector<int> v, int n)
{
node* root = NULL;
for(int i = 0; i < n; i++){
//插入每一个节点
insert(root,v[i]);
}
return root;
}
//比较两个数组是否相同:0表示不同,1表示相同
int cmp(vector<int> &a, vector<int> &b,int n)
{
for(int i = 0; i < n; i++){
if(a[i] != b[i]){
return 0;
}
}
return 1;
}
//【先序遍历二叉树】并且vi里装着序列。
vector<int> v2;
void preorder (node* root)
{
if(root == NULL)
return;
//printf("%d ", root->data);
v2.push_back(root->data);
preorder(root->lchild);
preorder(root->rchild);
}
//【先序遍历其镜像树】
vector<int> v3;
void preorderjx (node* root)
{
if(root == NULL)
return;
//printf("%d ", root->data);
v3.push_back(root->data);
preorderjx(root->rchild);
preorderjx(root->lchild);
}
//输出原树的后序遍历
int numy = 0;
void postorder(node* root)
{
if(root == NULL)
return;
postorder(root->lchild);
postorder(root->rchild);
numy++;
if(numy != n)
printf("%d ",root->data);
else
printf("%d",root->data);
}
//输出镜像树的后序遍历
int numjx = 0;
void postorderjx(node* root)
{
if(root == NULL)
return;
postorderjx(root->rchild);
postorderjx(root->lchild);
numjx++;
if(numjx != n)
printf("%d ",root->data);
else
printf("%d",root->data);
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++){
int x;
scanf("%d", &x);
v1.push_back(x);
}
/*printf("v1如下:\n");
for(int i = 0; i < v1.size(); i++)
printf("%d",v1[i]);
printf("\n");*/
node* root = Create(v1,n);//root为此树木。
preorder(root);//先序遍历,得到v2。
/*printf("v2如下:\n");
for(int i = 0; i < v2.size(); i++)
printf("%d",v2[i]);
printf("\n");*/
if(cmp(v1,v2,n) == 1){//即相同,直接后序遍历原树。
printf("YES\n");
postorder(root);
return 0;
}
else{//v1,v2不同,要求它的镜像树的先序序列。
preorderjx(root);//先序遍历其镜像树,得到v3
/* printf("v3如下:\n");
for(int i = 0; i < v3.size(); i++)
printf("%d",v3[i]);
printf("\n");*/
if(cmp(v1,v3,n) == 1){ //相同了,输出镜像树的后序。
printf("YES\n");
postorderjx(root);
return 0;
}
else{//还是不同
printf("NO");
return 0;
}
}
return 0;
}
终于通过了 如鲠在喉