PAT A1043
题意要看懂,镜像树与原树的先后序遍历有区别
镜像树先后序遍历均先遍历右子树。
考点:建树、插入、先后序遍历;
#include<vector>
#include<cstdio>
#include<iostream>
using namespace std;
int data[1100];
struct node{
int d;
node* left;
node* right;
};
void insert(node* &root,int d){
if(root==NULL){
root=new node;
root->d=d;
root->left=NULL;
root->right=NULL;
}else if(root->left==NULL && d<root->d){
node *p=new node;
p->d=d;
p->left=NULL;
p->right=NULL;
root->left=p;
}else if(root->right==NULL && d>=root->d){
node *p=new node;
p->d=d;
p->left=NULL;
p->right=NULL;
root->right=p;
}else{
if(d>=root->d){
insert(root->right,d);
}else{
insert(root->left,d);
}
}
}
node* create(int data[],int n){
node* root=NULL;
for(int i=0;i<n;i++){
insert(root,data[i]);
}
return root;
}
void pre(node* root,vector<int> &vi){
if(root==NULL) return;
vi.push_back(root->d);
pre(root->left,vi);
pre(root->right,vi);
}
void post(node* root,vector<int> &vi){
if(root==NULL) return;
post(root->left,vi);
post(root->right,vi);
vi.push_back(root->d);
}
void prem(node* root,vector<int> &vi){
if(root==NULL) return;
vi.push_back(root->d);
prem(root->right,vi);
prem(root->left,vi);
}
void postm(node* root,vector<int> &vi){
if(root==NULL) return;
postm(root->right,vi);
postm(root->left,vi);
vi.push_back(root->d);
}
int main(){
int n;
vector<int> o,pre1,post1,prem1,postm1;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&data[i]);
o.push_back(data[i]);
}
node* root=create(data,n);
pre(root,pre1);
post(root,post1);
prem(root,prem1);
postm(root,postm1);
// for(int i=0;i<post1.size();i++){
// printf("%d",post1[i]);
// }
// printf("\n");
//
//
// for(int i=0;i<pre1.size();i++){
// printf("%d",pre1[i]);
// }
// printf("\n");
//
// for(int i=0;i<prem1.size();i++){
// printf("%d",prem1[i]);
// }
// printf("\n");
if(o==pre1){
printf("YES\n");
for(int i=0;i<post1.size();i++){
printf("%d",post1[i]);
if(i<post1.size()-1) printf(" ");
}
}else if(o==prem1){
printf("YES\n");
for(int i=0;i<postm1.size();i++){
printf("%d",postm1[i]);
if(i<postm1.size()-1) printf(" ");
}
}else{
printf("NO\n");
}
}