题目

是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第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. 分别建两棵搜索树的判别方法
    根据两个序列分别建树,再判别树是否一样
  2. 不建树的判别方法

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}
不一样

  1. 建一棵树,再判别其他序列是否与该树一致(本文采取该方法)

求解思路

  1. 搜索树表示
  2. 建搜索树T
  3. 判别一序列是否与搜索树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语言实现)相关推荐

  1. 5-4 是否同一棵二叉搜索树 (25分)

    https://pta.patest.cn/pta/test/15/exam/4/question/712 这道题考察二叉搜索树的实现,并且还需要一定的逻辑与算法,所以题目还是挺好的. 5-4 是否同 ...

  2. 7-4 是否同一棵二叉搜索树 (25 分)

    是否同一棵二叉搜索树 1.题目描述: 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入 ...

  3. 04-树4 是否同一棵二叉搜索树 (25 分)

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  4. LeetCode 1214. 查找两棵二叉搜索树之和(二叉树迭代器+双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给出两棵二叉搜索树,请你从两棵树中各找出一个节点,使得这两个节点的值之和等于目标值 Target. 如果可以找到返回 True,否则返回 False. 示 ...

  5. 是否同一棵二叉搜索树

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  6. 7-1 是否同一棵二叉搜索树 (30分)

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  7. 基础数据结构——是否同一棵二叉搜索树

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  8. 数据结构:判断是否为同一棵二叉搜索树

    前言碎语 作为一个代码小白,在自学的过程中,最舒服的好像就是有讲解.有提示.甚至直接是有源码--然而,照着写永远是无法进步的,因为,很可能最后错了自己都不知道错在了哪! 就比如下面这个,照着MOOC小 ...

  9. 7-1 是否同一棵二叉搜索树 (25 分)

    大一下半期数据结构 是否同一棵二叉搜索树 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1} ...

  10. 是否同一棵二叉搜索树_如何在同一台计算机上安装Java的多个版本

    是否同一棵二叉搜索树 一段时间以前,我写了一篇文章< 用示例解释Java Lambda表达式>,但是我很容易浏览Java 8,因为我在项目中使用了Java 8,并且允许我安装和使用它. 但 ...

最新文章

  1. 4 关卡编辑器_虚幻引擎4与生存游戏产生化学反应,超真实开放世界手游诞生
  2. Spring Cloud【Finchley】- 21 Spring Cloud Stream 构建消息驱动微服务
  3. 解决在Mac上用pyenv安装python3失败的问题
  4. 轻松为Windows系统快速配置多个网关
  5. 虫食算(洛谷-P1092)
  6. C#中i=i++值不变的一个解释
  7. SQL Server – QP的另一个X射线
  8. C# LINQ 对象克隆
  9. cocos2d-x学习笔记07:在cocos2d-x中使用RTTI
  10. caffe使用预训练的模型进行finetune
  11. 系统安全之数据加密解密
  12. ssh登录很慢,登录上去后速度正常问题的解决方法
  13. SCRUM浅谈,User Story,Sprint,Burn Down Chart
  14. 都说IT行业有前景,请问凭什么?
  15. 雷神战争中简单megetexture地图制作
  16. Win10完全卸载MySQL
  17. 手把手教你Android来去电通话自动录音的方法
  18. 利用python爬取东方财富网股吧评论并进行情感分析(一)
  19. ASCII码表及扩展ASCII码表
  20. 小米2017校招面试经历

热门文章

  1. MybatisPlus实现自动填充
  2. 集合元素处理(传统方式)
  3. Eureka Client的使用
  4. 东莞电子计算机学校,东莞市电子科技学校
  5. c# wpf 面试_WPF 基础面试题及答案(一)
  6. Versions maven plugin 修改版本
  7. hadoop读取mysql数据_Pyspark连接mysql、hive、hdfs 实例展示
  8. pip install python -32_pip安装python模块方法
  9. 15怎么自己画元件_【技术】3.1(1) 先了解清楚了,才能画一个元件-成都单片机开发...
  10. 端口号被占用时,查找占用该端口号的进程并释放端口号