04-树4 是否同一棵二叉搜索树 (25 分)(考察二叉搜索树的基本操作)

该博客讨论了如何判断不同插入序列是否能生成相同的二叉搜索树。通过输入序列和待检查序列,通过先序遍历比较生成的树是否一致。文章提到了程序实现中的关键点,如插入操作、树的销毁以及全局变量的管理。
摘要由CSDN通过智能技术生成

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。随后L行,每行给出N个插入的元素,属于L个需要检查的序列。

简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
结尾无空行
输出样例:
Yes
No
No

这题考的其实不难,只不过自己在写程序的过程中一个flag没有置0,导致一直有一组测试数据过不去罢了。
其实解题步骤如下:
1.先写一个二叉搜索树的插入操作
2.不停利用插入操作建立二叉搜索树
3.利用二叉树先序遍历把查找树元素放入数组里面,然后进行比较
4.销毁二叉树,重新下一次比较
这题我出bug的地方还是挺多的,首先一点就是二叉树插入和建树过程中BTNode建立的结点在函数参数必须是引用参数,这样才能把二叉链传递下去,才能把二叉树给建立起来。然后比较完之后记得销毁二叉树释放空间。
还有一点就是数组定义的是全局变量,还有表示数组下标的flag也是全局变量,在每一次后序遍历存入数组之后,记得要把flag重新置0,这样才能保证下一轮比较不会出现错误。
代码如下:

#include<iostream>
using namespace std;
const int MaxSize = 50;
int a[MaxSize], b[MaxSize];
//建立树的节点
typedef int ElemType;
typedef struct node {
   
	ElemType data;
	struct node* lchild;
	struct node* rchild;
}BTNode;
//插入节点到二叉搜索树中
BTNode* Insert(ElemType x, BTNode* &a0)//如果这个a0前面不加&的话,这些操作的效果无法传递
{
   
	if (!a0)
	{
   
		a0 = new BTNode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值