没做出.
关键点:
1、将二叉搜索树建起来.
2、先序镜像遍历二叉搜索树.
3、后序镜像遍历二叉搜索树.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
struct node{
int data;
node* lchild;
node* rchild;
};
void insert(node* &root,int x){
if(root==NULL){
root=new node; //初始化经常忘记.
root->data=x;
root->lchild=root->rchild=NULL;
return;
}
if(root->data<=x){
insert(root->rchild,x);
}else{
insert(root->lchild,x);
}
}
void pre_build(vector<int> &pre,node* root){
if(root==NULL){
return;
}
pre.push_back(root->data);
pre_build(pre,root->lchild);
pre_build(pre,root->rchild);
}
void preM_build(vector<int> &preM,node* root){
if(root==NULL){
return;
}
preM.push_back(root->data);
preM_build(preM,root->rchild);
preM_build(preM,root->lchild);
}
void pros_build(vector<int> &pros,node* root){
if(root==NULL){
return;
}
pros_build(pros,root->lchild);
pros_build(pros,root->rchild);
pros.push_back(root->data);
}
void prosM_build(vector<int> &prosM,node* root){
if(root==NULL){
return;
}
prosM_build(prosM,root->rchild);
prosM_build(prosM,root->lchild);
prosM.push_back(root->data);
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n;
node* root=NULL; //定义头结点
vector<int> origin,pre,preM,pros,prosM;
scanf("%d",&n);
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
origin.push_back(temp);
insert(root,temp);
}
pre_build(pre,root);
preM_build(preM,root);
if(origin==pre){
pros_build(pros,root);
printf("YES\n");
for(int i=0;i<pros.size();i++){
printf("%d",pros[i]);
if(i<pros.size()-1){
printf(" ");
}
}
}else{
if(origin==preM){
prosM_build(prosM,root);
printf("YES\n");
for(int i=0;i<prosM.size();i++){
printf("%d",prosM[i]);
if(i<prosM.size()-1){
printf(" ");
}
}
}else{
printf("NO\n");
}
}
return 0;
}
优化,在读入数据时同时建立其镜像二叉树,只需要将插入时的比较逻辑反过来即可.这样先序遍历和后序遍历只需要各写一个函数.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
struct node{
int data;
node* lchild;
node* rchild;
};
void insert(node* &root,int x){
if(root==NULL){
root=new node; //初始化经常忘记.
root->data=x;
root->lchild=root->rchild=NULL;
return;
}
if(root->data<=x){
insert(root->rchild,x);
}else{
insert(root->lchild,x);
}
}
void insertM(node* &rootM,int x){
if(rootM==NULL){
rootM=new node; //初始化经常忘记.
rootM->data=x;
rootM->lchild=rootM->rchild=NULL;
return;
}
if(rootM->data>x){
insertM(rootM->rchild,x);
}else{
insertM(rootM->lchild,x);
}
}
void pre_build(vector<int> &vi,node* root){ //先序
if(root==NULL){
return;
}
vi.push_back(root->data);
pre_build(vi,root->lchild);
pre_build(vi,root->rchild);
}
void pros_build(vector<int> &vi,node* root){ //后序
if(root==NULL){
return;
}
pros_build(vi,root->lchild);
pros_build(vi,root->rchild);
vi.push_back(root->data);
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n;
node* root=NULL; //定义头结点
node* rootM=NULL;
vector<int> origin,pre,preM,pros,prosM;
scanf("%d",&n);
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
origin.push_back(temp);
insert(root,temp);
insertM(rootM,temp);
}
pre_build(pre,root);
pre_build(preM,rootM);
if(origin==pre){
pros_build(pros,root);
printf("YES\n");
for(int i=0;i<pros.size();i++){
printf("%d",pros[i]);
if(i<pros.size()-1){
printf(" ");
}
}
}else{
if(origin==preM){
pros_build(prosM,rootM);
printf("YES\n");
for(int i=0;i<prosM.size();i++){
printf("%d",prosM[i]);
if(i<prosM.size()-1){
printf(" ");
}
}
}else{
printf("NO\n");
}
}
return 0;
}