浙大数据结构之04-树4 是否同一棵二叉搜索树

news/2024/12/2 10:05:44/

题目详情:

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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

主要思路:

(1)循环读入数据,并且在读到0时跳出循环可以写在while里

(2)插入二叉搜索树,用递归,因为插入的必是叶子节点,关键要有返回值,返回的是节点指针

(3)先建立初始树,然后建立待比较树,用前序遍历比较两棵树是否相同

代码实现:

/*
首先要读入数据
建立原始树
建立插入树
比较原始树和插入树
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 15
/*用链表定义二叉搜索树的数据结构*/
typedef struct Tree Tree;
struct Tree {int Data;Tree* LeftChild;Tree* RightChild;
};
/*插入二叉搜索树*/
Tree* InsertBST(Tree* root, int data) {if(root == NULL) {root = (Tree*)malloc(sizeof(Tree));root->Data = data;root->LeftChild = root->RightChild = NULL;return root;}if(root->Data > data) {root->LeftChild = InsertBST(root->LeftChild, data);}else if(root->Data < data) {root->RightChild = InsertBST(root->RightChild, data);}return root;
}
/*前序遍历,判断两棵树是不是同一棵树*/
bool JudgeBST(Tree* root1, Tree* root2) {if(root1 == NULL && root2 == NULL) {return true;}if(root1 == NULL && root2 != NULL || root1 != NULL && root2 == NULL) {return false;}if(root1->Data == root2->Data) {bool leftSubtree = JudgeBST(root1->LeftChild, root2->LeftChild);bool rightSubtree = JudgeBST(root1->RightChild, root2->RightChild);if(leftSubtree && rightSubtree) {return true;}else return false;}else return false;
}
/*删除树*/
void DeleteTree(Tree* root) {if(root == NULL) {free(root);return;}DeleteTree(root->LeftChild);DeleteTree(root->RightChild);free(root);return;
}
int main() {int N, L;while(scanf("%d", &N) && N != 0 && scanf("%d", &L)) {Tree* initTree = NULL;/*建立原始二叉搜索树*/for(int i = 0; i < N; i++) {int data;scanf("%d", &data);initTree = InsertBST(initTree, data);}/*检查序列*/for(int i = 0; i < L; i++) {Tree* checkTree = NULL;for(int i = 0; i < N; i++) {int data;scanf("%d", &data);checkTree = InsertBST(checkTree, data);}if(JudgeBST(initTree, checkTree)) {printf("Yes\n");}else {printf("No\n");}DeleteTree(checkTree);}DeleteTree(initTree);}return 0;
}


http://www.ppmy.cn/news/911317.html

相关文章

室内定位导航

到一个大商场&#xff0c;突然想上厕所&#xff0c;或者找ATM取现金&#xff0c;或者找某个出口&#xff0c;从前&#xff0c;要么找导航板&#xff0c;要么问人。当然&#xff0c;导航板没有那么容易找&#xff0c;问人&#xff0c;也许只是简单的告知需要先左拐再右拐再左拐.…

北斗导航 | 完全自主研发国产高端三维激光雷达助力中国测绘技术发展

================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 ================================================ 完全自主研发国产高端三维激光雷达助力中国测绘技术发展 首次亮相青岛第…

手机导航已死!

车&#xff0c;是家的延伸。 很多人买车&#xff0c;都是在成家后&#xff0c;为了方便家庭出行才选择买车。 而导航&#xff0c;也成了开车族的头等大事。 4月18日&#xff0c;北京竞园艺术中心&#xff0c;天猫精灵2019春季新品发布会如期召开。 发布会上&#xff0c;高德…

中国北斗卫星导航系统

中国北斗卫星导航系统 (2016年6月) 目录 前言 一、发展目标与原则 二、持续建设和发展北斗系统 三、提供可靠安全的卫星导航服务 四、推动北斗系统应用与产业化发展 五、积极促进国际合作与交流

园区导航系统-室内外一体化定位导航-蓝牙+手机端室内定位导航方案

园区3D室内系统通过构建一个虚拟3D可视化虚拟场景地图为基础&#xff0c;实现的功能&#xff1a;路线导航&#xff08;同楼层/跨楼层/跨楼宇&#xff09;、楼层切换、公共设施查询、语音播报、地图旋转、2D/3D切换&#xff0c;位置点定位等功能。 图片来源&#xff1a;永拓科技…

腾讯AI Lab与北京协和医院联合发布国产手术导航系统

感谢阅读腾讯AI Lab微信号第149篇文章。本文介绍腾讯 AI Lab 联合北京协和医院共同发布便携式智能化手术导航系统。 7月5日&#xff0c;腾讯 AI Lab 联合北京协和医院&#xff0c;共同发布了具有有完全自主知识产权的便携式智能化手术导航系统&#xff0c;临床初步应用取得成功…

室内外无缝定位导航如何实现?室内外一体化定位导航系统服务与应用!

随着物联网技术的发展,能够迎合室内定位的技术也逐渐增多,在市场上不断的更新迭代下,需要室内定位来维护与管理企业的各项事务也越来越多&#xff0c;人类对位置信息服务的需求也达到了一个前所未有的高度&#xff0c;而位置信息服务提供导航与定位功能,包括室外导航定位和室内…

自动驾驶感知——导航与定位

文章目录 1. 汽车定位技术1.1 汽车定位技术的定义1.2 汽车定位技术实现方式1.3 定位源1.3.1 不同定位源之间的联系 2. 卫星定位技术2.1 全球四大导航卫星系统2.1.1 GPS2.1.2 GLONASS2.1.3 BDS2.1.4 GALILEO 2.2 卫星定位原理2.3 卫星定位方法分类 3. 卫星组合惯导定位3.1 惯性导…