【PAT甲级】1043 Is It a Binary Search Tree (25分)

解题过程的小记录,如有错误欢迎指出。

难度:四星(又是没看懂题目的一题)

题目分析

给出一串数列,该数列是二叉搜查数的插入数列,按照插入顺序建立树后看这个数列是否是该数的先序遍历数列,或者是镜像先序遍历数列(镜像也就是左右子树交换)

注意点

  1. 不能采用BST的中序遍历数列是递增数列的特性结合先序序列,因为本题的数字有重复
  2. 插入建树注意返回值,和参数的引用

我的解题过程

思路

  1. 利用数列进行插入建立BST,同时把数列保存在vector数组里
  2. 建立树后进行先序遍历和镜像先序遍历,分别把数组保存在vector数组里
  3. 将两个先序遍历的数列与初始数列进行比较
  4. 如果是非镜像先序数列,则按照正常后序数列进行输出,如果是镜像的,则按照进行的后序遍历

bug

  1. 并没有get到题目给出的是BST的插入队列,还以为默认是先序了,所以结合BST中序是从小到大的特点,创建了树,但是因为数据有重复的,所以这个方法会有两个测试点过不了,因为创建的树并不唯一
  2. 采用了晴神的方法,在建立树以后,对数进行先序遍历和镜像先序遍历对照的时候,因为复制粘贴代码,递归的部分没有修改所以报错
  3. 采用插入创建树的时候没有用引用

代码

#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的代码

全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~

借鉴点

  1. 采用vector进行保存数列,这样就可以直接用等号进行比较
  2. 本题参考晴神即可(我的代码也是参考上机笔记写的)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值