解题过程的小记录,如有错误欢迎指出。
难度:四星(又是没看懂题目的一题)
题目分析
给出一串数列,该数列是二叉搜查数的插入数列,按照插入顺序建立树后看这个数列是否是该数的先序遍历数列,或者是镜像先序遍历数列(镜像也就是左右子树交换)
注意点
- 不能采用BST的中序遍历数列是递增数列的特性结合先序序列,因为本题的数字有重复
- 插入建树注意返回值,和参数的引用
我的解题过程
思路
- 利用数列进行插入建立BST,同时把数列保存在vector数组里
- 建立树后进行先序遍历和镜像先序遍历,分别把数组保存在vector数组里
- 将两个先序遍历的数列与初始数列进行比较
- 如果是非镜像先序数列,则按照正常后序数列进行输出,如果是镜像的,则按照进行的后序遍历
bug
- 并没有get到题目给出的是BST的插入队列,还以为默认是先序了,所以结合BST中序是从小到大的特点,创建了树,但是因为数据有重复的,所以这个方法会有两个测试点过不了,因为创建的树并不唯一
- 采用了晴神的方法,在建立树以后,对数进行先序遍历和镜像先序遍历对照的时候,因为复制粘贴代码,递归的部分没有修改所以报错
- 采用插入创建树的时候没有用引用
代码
#include<iostream>
#include<vector>
using namespace std;
struct node {
int data;
node *lchild, *rchild;
};
int cnt = 0, n;
vector<int> origin, pre1, pre2;
void insert(node* &root, int x) {
if (root == NULL) {
root = new node;
root->data = x;
root->lchild = NULL;
root->rchild = NULL;
return;
}
if (x < root->data) insert(root->lchild, x);
else insert(root->rchild, x);
}
void preoroder(node *root) {
if (root == NULL) return;
pre1.push_back(root->data);
if (root->lchild != NULL) preoroder(root->lchild);
if (root->rchild != NULL) preoroder(root->rchild);
}
void preoroder2(node *root) {
if (root == NULL) return;
pre2.push_back(root->data);
if (root->rchild != NULL) preoroder2(root->rchild);
if (root->lchild != NULL) preoroder2(root->lchild);
}
void postorder(node *root) {
if (root->lchild != NULL) postorder(root->lchild);
if (root->rchild != NULL) postorder(root->rchild);
printf("%d", root->data);
cnt++;
if (cnt < n) printf(" ");
}
void postorder2(node *root) {
if (root->rchild != NULL) postorder2(root->rchild);//**赋值粘贴的递归部分不要忘记修改
if (root->lchild != NULL) postorder2(root->lchild);
printf("%d", root->data);
cnt++;
if (cnt < n) printf(" ");
}
int main()
{
scanf("%d", &n);
node *root = NULL;
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
origin.push_back(num);
insert(root, num);
}
preoroder(root);
preoroder2(root);
if (origin == pre1) {
printf("YES\n");
postorder(root);
}
else if (origin == pre2) {
printf("YES\n");
postorder2(root);
}
else {
printf("NO\n");
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
- 采用vector进行保存数列,这样就可以直接用等号进行比较
- 本题参考晴神即可(我的代码也是参考上机笔记写的)