https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192
#include <bits/stdc++.h>
using namespace std;
struct Tnode
{
int data;
struct Tnode *left;
struct Tnode *right;
};
vector<int >pre;//前序
vector<int>pre_;//镜像
vector<int>v;//初始序列
vector<int>post;//后序遍历
vector<int>post_;
typedef struct Tnode* Btree;//指针
void preorder(Btree root)
{
if(root==NULL)
return ;
else
{
pre.push_back(root->data);
preorder(root->left);
preorder(root->right);
}
}
void preorder_(Btree root)//镜像术的遍历
{
if(root==NULL)
return ;
else
{
pre_.push_back(root->data);
preorder_(root->right);
preorder_(root->left);
}
}
void postorder(Btree root)
{
if(!root)
return ;
else
{
postorder(root->left);
postorder(root->right);
post.push_back(root->data);
}
}
void postorder_(Btree root)
{
if(!root)
return ;
else
{
postorder_(root->right);
postorder_(root->left);
post_.push_back(root->data);
}
}
void Insert(Btree &root,int x)//递归找到空位置就可以插入
{
if(root==NULL)
{
root=new struct Tnode;
root->data=x;
root->left=NULL;
root->right=NULL;
return;
}
else if(x<root->data)
{
Insert(root->left,x);
}
else if(x>=root->data)
{
Insert(root->right,x);
}
}
int main()
{
int n;
int num;
cin>>n;
Btree root=NULL;//如果不赋值 那么一进去指针就是随机指向
for(int i=0;i<n;++i)
{
cin>>num;
v.push_back(num);
Insert(root,num);
}
preorder(root);
preorder_(root);
postorder(root);
postorder_(root);
int flag1=0,flag2=0;
for(int i=0;i<v.size();++i)
{
if(v[i]!=pre[i])
{
flag1=1;
break;
}
}
for(int i=0;i<v.size();++i)
{
if(v[i]!=pre_[i])
{
flag2=1;
break;
}
}
if(flag2==1&&flag1==1)
{
cout<<"NO";
}
else
{
if(flag1==0)
{
cout<<"YES"<<endl;
cout<<post[0];
for(int i=1;i<post.size();++i)
cout<<" "<<post[i];
}
else
{
cout<<"YES"<<endl;
cout<<post_[0];
for(int i=1;i<post_.size();++i)
cout<<" "<<post_[i];
}
}
return 0;
}