很棒的题,把BST和二叉树遍历都考查到了。
主要知识点有一下几个方面:
1.向量可以直接通过等号判断是否相同。
2.树的插入需要用引用,特别是插入结点时,需要先申请空间。

root  = new node

3.最开始的根结点可以不申请空间,而只创建出一个空指针。注意,一定要是空指针。

node* root = NULL

4.所谓镜像BST就是交换了左右子树,如果理解了遍历的含义,就能灵活的转变。

代码如下

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
struct node{
	int data;
	node* left,*right;
};
vector<int> pre,mir,org,post,postm;
void insert(node* &root, int x){
	if(root == NULL){
		root = new node;  //很容易忘记 
		root->data = x;
		root->left=root->right = NULL;
		return ;  //很关键 
	}
	else if(root->data > x){
		 insert(root->left,x);
	}else{
		insert(root->right,x);
	} 
}
void preorder(node* root){
	if(root == NULL) return;
	pre.push_back(root->data);
	preorder(root->left);
	preorder(root->right);
}
void mirror(node* root){
	if(root == NULL) return;
	mir.push_back(root->data);
	mirror(root->right);
	mirror(root->left);
	
}
void postorder(node* root){
	if(root == NULL) return;
	postorder(root->left);
	postorder(root->right);
	post.push_back(root->data);
}
void postmir(node* root){
	if(root == NULL) return;
	postmir(root->right);
	postmir(root->left);
	postm.push_back(root->data);
}
int n;
int main(){
	scanf("%d",&n);
	node* root = NULL; //空指针 
	int num;
	for(int i=0;i<n;i++){
		scanf("%d",&num);
		org.push_back(num);
		insert(root,num);
	}
	preorder(root);
	mirror(root);
	postorder(root);
	postmir(root);
	
	if(org == pre){
		printf("YES\n");
		for(int i=0;i<post.size();i++){
			if(i>0) printf(" ");
			printf("%d",post[i]);
		}
		printf("\n");
	}else if(org == mir){
		printf("YES\n");
		for(int i=0;i<postm.size();i++){
			if(i>0) printf(" ");
			printf("%d",postm[i]);
		}
		printf("\n");
	}else printf("NO\n");
	return 0;
}