很棒的题,把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;
}