小白专场-是否同一颗二叉搜索树-c语言实现
更新、更全的《数据结构与算法》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html
一、题意理解
给定一个插入序列就可以唯一确定一颗二叉搜索树。然而,一颗给定的二叉搜索树却可以由多种不同的插入序列得到。例如:按照序列 {2, 1, 3} 和 {2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。
问题:对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

二、求解思路
两个序列是否对应相同搜索树的判别
- 分别建两颗搜索树的判别方法:根据两个序列分别建树,再判别树是否一样
- 不建树的判别方法

- 建一棵树,再判别其他序列是否与该树一致(本篇文章重点讨论)
- 搜索树表示
- 建搜索树T
- 判别一序列是否与搜索树T一致
三、搜索树表示
/* c语言实现 */
typedef struct TreeNode *Tree;
struct TreeNode
{
int v;
Tree Left, Right;
int flag;
}
程序框架搭建
/* c语言实现 */
int main()
{
对每组数据;
* 读入N和L;
* 根据第一行序列建树T;
* 依据树T分别判别后面的L个序列是否能与T形成同一搜索树并输出结果;
return 0;
}
int main()
{
int N, L, i;
Tree T;
scanf("%d", &N);
while (N) {
scanf("%d", &L);
T = MakeTree(N); // 读数据建搜索树T
for (i=0; i<L, i++){
if (Judge(T, N)) printf("Yes\n"); // 判别一序列是否与T构成一样的搜索树
else printf("No\n");
ResetT(T); // 清除T中的标记flag
}
FreeTree(T);
scanf("%d", &N);
}
return 0;
}
3.1 如何建搜索树
/* c语言实现 */
Tree MakeTree(int N)
{
Tree T;
int i, V;
scanf("%d", &V);
T = NewNode(V);
for (i=1; i<N; i++){
scanf("%d", &V);
T = Insert(T, V); // 按照搜索树顺序插入左右结点
}
return T;
}
Tree Insert(Tree T, int V)
{
if (!T) T = NewNode(V);
else{
if (V > T->v)
T->Right = Insert(T->Right, V);
else
T->Left = Insert(T->Left, V);
}
return T;
}
Tree NewNode(int V)
{
Tree T = (Tree)malloc(sizeof(struct TreeNode));
T->v = V;
T->Left = T->Right = NULL; // 左右子树设置为空
T->flag = 0;
return T;
}
3.2 如何判别

如何判别序列 3,2,4,1 是否与树T一致?
方法:在树T中按顺序搜索序列 3,2,4,1 中的每个数
- 如果每次搜索所经过的结点在前面均出现过,则一致
- 否则(某次搜索中遇到前面未出现的结点),则不一致
/* c语言实现 */
int check(Tree T, int V)
{
if (T->flag) {
// 如果flag为1,则递归搜索子结点
if (V < T->v) return check(T->Left, V);
else if (V > T->v) return check(T->Right, V);
}
else{
if (V == T->v){
T->flag = 1;
return 1;
}
else return 0;
}
}
// 有bug版本的Judge方法:当发现序列中的某个树与T不一致时,必须把序列后面的数都读完,如序列 3,2,4,1 ,在读取2时就会发现两颗是不相同的搜索树,下面这段代码则不会继续读取 4,1,而是把它归入下一个序列
int Judge(Tree T, int N)
{
int i, V;
scanf("%d", &V);
if (V != T->v) return 0;
else T->flag = 1;
for (i=1; i<N; i++){
scanf("%d", &V);
if (!check(T, V)) return 0;
}
return 1;
}
// 无bug版本的Judge方法
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))) flag = 1;
}
if (flag) return 0;
else return 1;
}
3.3 清空树
/* c语言实现 */
// 清除T中各结点的flag标记
void ResetT(Tree T)
{
if (T->Left) ResetT(T->Left);
if (T->Right) ResetT(T->Right);
T->flag = 0;
}
// 释放T的空间
void FreeTree(Tree T)
{
if (T->Left) FreeTree(T->Left);
if (T->Right) FreeTree(T->Right);
free(T);
}
小白专场-是否同一颗二叉搜索树-c语言实现的更多相关文章
- 小白专场-是否同一颗二叉搜索树-python语言实现
目录 一.二叉搜索树的相同判断 二.问题引入 三.举例分析 四.方法探讨 4.1 中序遍历 4.2 层序遍历 4.3 先序遍历 4.4 后序遍历 五.总结 六.代码实现 一.二叉搜索树的相同判断 二叉 ...
- 二叉搜索树 C语言实现
1.二叉搜索树基本概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是一棵具有如下特性的非空二叉树: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非 ...
- 给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdafx.h ...
- Convert Sorted Array to Binary Search Tree(将一个有序数组转换成一颗二叉搜索树)
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...
- 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...
- leetcode-第10周双周赛-5080-查找两颗二叉搜索树之和
题目描述: 自己的提交: class Solution: def twoSumBSTs(self, root1: TreeNode, root2: TreeNode, target: int) -&g ...
- 二叉搜索树的第k个结点
给定一颗二叉搜索树,请找出其中的第k小的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. /* public class TreeNode { ...
- HDU 3791 二叉搜索树
二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 【剑指offer 面试题27】二叉搜索树与双向链表
输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. C++: #include <iostream> using namespace std; struct TreeNode { ...
随机推荐
- fastdfs使用总结
参考:https://www.cnblogs.com/chiangchou/p/fastdfs.html 说明:这篇博客是为了记录我在安装和使用FastDFS分布式文件系统时遇到的问题和解决方法, ...
- Regex quick reference
近段时间,接触正则较多,常规法则如下,网摘内容,方便查阅.
- kindEditor 修改上传图片的路径
压缩过的js类似
- JDBC释放数据库连接
try(){}写法会自动关闭连接 String sql = "select password from user where name = ?"; try(Connection c ...
- php-laravel框架用户验证(Auth)模块解析(一)
一.初始化 使用php artisan命令进行初始化:php artisan make:auth 和 php artisan migrate(该命令会生成users表.password_resets表 ...
- RabbitMQ的交换器Exchange之direct(发布与订阅 完全匹配)
1.交换器.用来接收生产者发送的消息并将这些消息路由给服务器中的队列.三种常用的交换器类型,a.direct(发布与订阅 完全匹配).b.fanout(广播).c.topic(主题,规则匹配). 2. ...
- c#中取绝对值
记一次工作中查询的资料: System.Math.Abs(float value); System.Math.Abs(decimal value); System.Math.Abs(int value ...
- SQLPrompt8.2 安装之后找不到激活入口
如果你发现是这样的,找不到像其他人说的serial number这个选项,不要惊慌.. 首先你得先断网,然后再打开sql客户端,点击Manage License ,然后你会看到 activate 这个 ...
- Promise简单使用,需要在ES6以上
//Promise延时顺序执行 var waitOne = new Promise(function(resolve, reject) { setTimeout(function(){ resolv ...
- 强大的Charles的使用,强大的flutter1.9
<a href="http://www.cocoachina.com/articles/37551?filter=ios"> 强大的Charles 强大的flutter