A1043

沒做出.
關鍵點:
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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章