一、技术总结
- 这一题是二叉排序树的问题,题目主要是给出二叉排序树的先序遍历或者二叉排序树镜像的先序遍历或其他,如果是前两种输出YES,并且输出各自的后序遍历。后者直接输出NO
- 关键在于创建树,据我观察发现无论是镜像的先序遍历还是原来二叉排序树的先序遍历,可以直接根据二叉排序树的特点进行树的创建。用inset函数,创建出来都是二叉排序树,没有镜像与不镜像之分。到了这一步,只需处理如何将这个标准的二叉排序树,变成镜像的先序遍历,其实只要将左右子树递归的顺序换一下即可。详细参考代码。
- 然后就是将其进行比较匹配,输出。
二、参考代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
node *lchild, *rchild;
};
void insert(node* &root, int data){
if(root == NULL){
root = new node;
root->data = data;
root->lchild = root->rchild = NULL;//这句不能够漏掉
return;
}
if(data < root->data) insert(root->lchild, data);
else insert(root->rchild, data);
}
//先序遍历结果存于vi
void preOrder(node* root, vector<int> &vi){
if(root == NULL) return;
vi.push_back(root->data);
preOrder(root->lchild, vi);
preOrder(root->rchild, vi);
}
//镜像树的先序遍历,结果存放于vi
void preOrderMirror(node* root, vector<int> &vi){
if(root == NULL) return;
vi.push_back(root->data);
preOrderMirror(root->rchild, vi);
preOrderMirror(root->lchild, vi);
}
//后序遍历结果存于vi
void postOrder(node* root, vector<int> &vi){
if(root == NULL) return;
postOrder(root->lchild, vi);
postOrder(root->rchild, vi);
vi.push_back(root->data);
}
//镜像树的后序遍历,结果存放于vi
void postOrderMirror(node* root, vector<int> &vi){
if(root == NULL) return;
postOrderMirror(root->rchild, vi);
postOrderMirror(root->lchild, vi);
vi.push_back(root->data);
}
vector<int> origin, pre, preM, post, postM;
int main(){
int n, data;
node* root = NULL;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &data);
origin.push_back(data);
insert(root, data);
}
preOrder(root, pre);
preOrderMirror(root, preM);
postOrder(root, post);
postOrderMirror(root, postM);
if(origin == pre){
printf("YES\n");
for(int i = 0; i < n; i++){
if(i != 0) printf(" ");
printf("%d", post[i]);
}
}else if(origin == preM){
printf("YES\n");
for(int i = 0; i < n; i++){
if(i != 0) printf(" ");
printf("%d", postM[i]);
}
}else{
printf("NO\n");
}
return 0;
}