小白专场-是否同一颗二叉搜索树-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 { ...
随机推荐
- Mixin Messenger 源码解读 1 — — WCDB Swift
Mixin Messenger 早期采用 FMDB 后来切换至 WCDB 沿用至今,一直比较可靠稳定,这里分享一下使用心得和功能扩展. 关于 Mixin Messenger Mixin Messeng ...
- JavaScript:了解一下函数式编程
一.简介 在JavaScript中,函数就是第一类公民,它可以像字符串.数字等变量一样,使用var修饰并作为数据使用.它可以作为数值.可以作为参数.还可以作为返回结果.可以说JavaScript就是函 ...
- 【Nginx】Nginx反向代理转发Host设置
#事故现场: 服务器A(Nginx服务器):192.168.2.126 服务器B(Web服务器):192.168.2.221 服务器A反向代理服务器B,A配置了upstream为: http { up ...
- 【Java线程与内存分析工具】VisualVM与MAT简明教程
目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...
- Mac(PC)连接虚拟机MySQL失败
解决: 首先登陆虚拟机的MySQL use mysql; select host,user from user; 可以看到,默认的mysql只允许本机访问 将host设置为通配符模式%,Host设置为 ...
- centos7开启,关闭防火墙
1.查看防火墙状态 firewall-cmd --state 2.停止防火墙 systemctl stop firewalld.service 3.禁止防火墙开机启动 systemctl disabl ...
- .net 数据源DataSet 转换成模型
/// <summary> /// DataSet转换成model 自动赋值返回集合 /// </summary> /// <typeparam name="T ...
- python读取Excel的值
上代码: import pandas as pd if __name__ == '__main__': #默认的读取第一个sheet df = pd.read_excel("E:\\MyPr ...
- js中for循环的研究
转自:http://blog.csdn.net/lushuaiyin/article/details/8541500 <html> <body> <b><ce ...
- 9.智能快递柜SDK(串口型锁板)
1.智能快递柜(开篇) 2.智能快递柜(终端篇) 3.智能快递柜(通信篇-HTTP) 4.智能快递柜(通信篇-SOCKET) 5.智能快递柜(通信篇-Server程序) 6.智能快递柜(平台篇) 7. ...