沒做出.
關鍵點:
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;
}