是否同一棵二叉搜索树(c语言实现)
题目
是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第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
几种方法
- 分别建两棵搜索树的判别方法
根据两个序列分别建树,再判别树是否一样 - 不建树的判别方法
3124 vs 3412
根结点都是3
{1 2} 3 {4} vs {1 2} 3 {4}
一样
3124 vs 3241
根结点都是3
{1 2} 3 {4} vs {2 1} 3 {4}
不一样
- 建一棵树,再判别其他序列是否与该树一致(本文采取该方法)
求解思路
- 搜索树表示
- 建搜索树T
- 判别一序列是否与搜索树T一致
搜索树表示
用链表表示
typedef struct TreeNode *Tree;
struct TreeNode{int v; //结点信息Tree Left,Right; //两个指针int flag; //有没有被访问过的标记
};
程序框架搭建
int main()
{ int N, L, i;Tree T;//读入N和Lscanf("%d", &N);while (N) {scanf("%d", &L);//根据第一行序列建树TT = MakeTree(N);for (i=0; i<L; i++) {//依据树T分别判别后面的L个序列是否能与T形成同一搜索树并输出结果if (Judge(T, N))printf("Yes\n");else printf("No\n");ResetT(T); //清除T中的标记flag}FreeTree(T);scanf("%d", &N);}return 0;
}
如何建搜索树
Tree MakeTree( int N )
{ Tree T;int i, V;scanf("%d", &V);T = NewNode(V); //构造第一个结点for (i=1; i<N; i++) { //读入N-1个元素,插入T里面scanf("%d", &V);T = Insert(T, V); //不断插入结点}return T;
}
//新建一个结点
Tree NewNode( int V )
{ Tree T = (Tree)malloc(sizeof(struct TreeNode));T->v = V; //v设为传进来的值T->Left = T->Right = NULL; //左右孩子设为0T->flag = 0; //flag设为0return T;
}
//递归插入结点
Tree Insert( Tree T, int V )
{if ( !T ) //T如果为空,插入第一个结点T = NewNode(V);else {if ( V>T->v ) //要插入的数比第一个结点大,插在右边T->Right = Insert( T->Right, V );else //否则插在左边T->Left = Insert( T->Left, V );}return T;
}
如何判别
如何判别序列3 2 4 1是否 与树T一致?
方法:在树T中按顺序搜索序列3 2 4 1中的每个数
如果每次搜索所经过的结点在前面均出现过,则一致
否则(某次搜索中遇到前面未出现的结点),则不一致
查找序列中的数在树中的位置,如果在查找过程中发现某个数以前没有碰到过,就是不一致。例如上图中T是3142,要判断序列3241,序列第一个数3在T中的根结点找到,flag标记为1,序列第二个数2在T中要经过3-1-2找到,3之前碰到过,而1之前没碰到过(flag=0)。所以不一致。
//判别方法:在T中搜索序列中的每一个整数
int check ( Tree T, int V )
{if ( T->flag ) { //这个结点访问过了if ( V<T->v ) return check(T->Left, V); //往左孩子找else if ( V>T->v ) return check(T->Right, V); //往右孩子找else return 0; //序列里面重复了,认为不一致}else { //没被访问过if ( V==T->v ) { //刚好是要访问的结点T->flag = 1; //flag设为1return 1;}else return 0; //碰到了以前没见过的结点}
}
//程序的flag和结点的flag要区分
int Judge( Tree T, int N )
{int i, V, flag = 0; /* flag: 0代表目前还一致,1代表已经不一致*/scanf("%d", &V);if ( V!=T->v ) flag = 1; //发现不一致else T->flag = 1;for (i=1; i<N; i++) {scanf("%d", &V);if ( (!flag) && (!check(T, V)) ) //不一致时不用check,但要把数读完flag = 1;}if (flag) return 0; //前面发现过不一致else return 1; //一致
}
void ResetT ( Tree T ) /* 清除T中各结点的flag标记 */
{if (T->Left) ResetT(T->Left); //左子树清零if (T->Right) ResetT(T->Right); //右子树清零T->flag = 0; //flag清零
}
void FreeTree ( Tree T ) /* 释放T的空间 */
{if (T->Left) FreeTree(T->Left); //释放左子树if (T->Right) FreeTree(T->Right); //释放右子树free(T); //释放结点
}
提交结果
是否同一棵二叉搜索树(c语言实现)相关推荐
- 5-4 是否同一棵二叉搜索树 (25分)
https://pta.patest.cn/pta/test/15/exam/4/question/712 这道题考察二叉搜索树的实现,并且还需要一定的逻辑与算法,所以题目还是挺好的. 5-4 是否同 ...
- 7-4 是否同一棵二叉搜索树 (25 分)
是否同一棵二叉搜索树 1.题目描述: 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入 ...
- 04-树4 是否同一棵二叉搜索树 (25 分)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- LeetCode 1214. 查找两棵二叉搜索树之和(二叉树迭代器+双指针)
文章目录 1. 题目 2. 解题 1. 题目 给出两棵二叉搜索树,请你从两棵树中各找出一个节点,使得这两个节点的值之和等于目标值 Target. 如果可以找到返回 True,否则返回 False. 示 ...
- 是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- 7-1 是否同一棵二叉搜索树 (30分)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- 基础数据结构——是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- 数据结构:判断是否为同一棵二叉搜索树
前言碎语 作为一个代码小白,在自学的过程中,最舒服的好像就是有讲解.有提示.甚至直接是有源码--然而,照着写永远是无法进步的,因为,很可能最后错了自己都不知道错在了哪! 就比如下面这个,照着MOOC小 ...
- 7-1 是否同一棵二叉搜索树 (25 分)
大一下半期数据结构 是否同一棵二叉搜索树 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1} ...
- 是否同一棵二叉搜索树_如何在同一台计算机上安装Java的多个版本
是否同一棵二叉搜索树 一段时间以前,我写了一篇文章< 用示例解释Java Lambda表达式>,但是我很容易浏览Java 8,因为我在项目中使用了Java 8,并且允许我安装和使用它. 但 ...
最新文章
- 4 关卡编辑器_虚幻引擎4与生存游戏产生化学反应,超真实开放世界手游诞生
- Spring Cloud【Finchley】- 21 Spring Cloud Stream 构建消息驱动微服务
- 解决在Mac上用pyenv安装python3失败的问题
- 轻松为Windows系统快速配置多个网关
- 虫食算(洛谷-P1092)
- C#中i=i++值不变的一个解释
- SQL Server – QP的另一个X射线
- C# LINQ 对象克隆
- cocos2d-x学习笔记07:在cocos2d-x中使用RTTI
- caffe使用预训练的模型进行finetune
- 系统安全之数据加密解密
- ssh登录很慢,登录上去后速度正常问题的解决方法
- SCRUM浅谈,User Story,Sprint,Burn Down Chart
- 都说IT行业有前景,请问凭什么?
- 雷神战争中简单megetexture地图制作
- Win10完全卸载MySQL
- 手把手教你Android来去电通话自动录音的方法
- 利用python爬取东方财富网股吧评论并进行情感分析(一)
- ASCII码表及扩展ASCII码表
- 小米2017校招面试经历
热门文章
- MybatisPlus实现自动填充
- 集合元素处理(传统方式)
- Eureka Client的使用
- 东莞电子计算机学校,东莞市电子科技学校
- c# wpf 面试_WPF 基础面试题及答案(一)
- Versions maven plugin 修改版本
- hadoop读取mysql数据_Pyspark连接mysql、hive、hdfs 实例展示
- pip install python -32_pip安装python模块方法
- 15怎么自己画元件_【技术】3.1(1) 先了解清楚了,才能画一个元件-成都单片机开发...
- 端口号被占用时,查找占用该端口号的进程并释放端口号