王道数据结构笔记01-二叉排序树/二叉查找树/BST

【滚雪球学数学建模】第1节·建模入门+三步法+案例 🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀! 阅读详情

一、二叉排序树的定义

二叉排序树,又称二叉查找树(BST,Binary Search Tree)
一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:
左子树上所有结点的关键字均小于根节点的关键字;
右子树上所有结点的关键字均大于根节点的关键字。
左子树和右子树又各是一棵二叉排序树。
即:
左子树结点值<根节点值<右子树结点值,默认不允许两个结点的关键字相同。
所以:
进行中序遍历,可以得到一个递增的有序序列;
如下图:
在这里插入图片描述
把上图中的右子树提取出来再看,依然满足构成二叉排序树的条件:
在这里插入图片描述
因此:

二叉排序树可用于元素的有序组织、搜索

二叉排序树结点(C语言算法实现):

typedef struct BSTNode {
	int key;
	struct BSTNode* lchild, * rchild;
}BSTNode, * BSTree;

二、二叉排序树的查找

演示1:查找关键字为9的结点:
在这里插入图片描述
若树非空,目标值与根节点的值比较:
若相等,则查找成功;
若小于根节点,则在左子树上查找,否则在右子树上查找。
查找成功,返回结点指针;查找失败,返回NULL;

在二叉排序树中查找值为k的结点(非递归实现)(C/C++算法实现):
最坏空间复杂度: O ( 1 ) O(1) O(1)

BSTNode* BST_Search(BSTree T, int k) {
	while (T != NULL && k != T->key) {	//若树或子树为空,或待查找的值等于根节点值,则结束循环
		if (k < T->key) T = T->lchild;	//小于,则在左子树上查找
		else T = T->rchild;			//大于,则在右子树上查找
	}
	return T;
}

在二叉排序树中查找值为 k k k的结点(递归实现)(C/C++算法实现):
最坏空间复杂度: O ( h ) O(h) O(h)

BSTNode* BST_Search(BSTree T, int k) {
	if (T == NULL)
		return NULL;	//查找失败
	if (k == T->key)
		return T;		//查找成功
	else if (k < T->key)
		return BST_Search(T->lchild, k);	//在左子树中找
	else
		return BST_Search(T->rchild, k);	//在右子树中找
}

三、二叉排序树的插入

演示2:插入关键字为61的结点:
在这里插入图片描述
若原二叉排序树为空,则直接插入结点;
否则,若关键字k小于根节点值,则插入到左子树,
若关键字k大于根节点值,则插入到右子树;

新插入的结点一定是叶子结点

在二叉排序树中插入关键字为 k k k的新结点(非递归实现)(C/C++算法实现):
最坏空间复杂度: O ( 1 ) O(1) O(1)

int BST_Insert(BSTree& T, int k) {
	BSTree p = T, parent = NULL;
	char childflag = 0;
	while (p != NULL && k != p->key) {	//若树或子树为空,或待查找的值等于根节点值,则结束循环
		parent = p;
		if (k < p->key) {
			p = p->lchild;		//小于,则在左子树上查找
			childflag = 0;
		}
		else {
			p = p->rchild;		//大于,则在右子树上查找
			childflag = 1;
		}
	}
	if (T == NULL || p == NULL) {
		BSTree t = (BSTree)malloc(sizeof(BSTNode));
		t->key = k;
		t->lchild = t->rchild = NULL;
		if (T == NULL) {			//原树为空,则新插入的结点为根节点
			T = t;
		}
		else if (p == NULL) {
			if (childflag == 0) {
				parent->lchild = t;	//插入到parent的左子树
			}
			else {
				parent->rchild = t;	//插入到parent的右子树
			}
		}
		return 1;				//返回1,插入成功
	}
	else if (k == p->key) {			//树中存在相同关键字的结点,插入失败
		return 0;
	}
}

在二叉排序树中插入关键字为 k k k的新结点(递归实现)(C/C++算法实现):
最坏空间复杂度: O ( h ) O(h) O(h)

int BST_Insert(BSTree& T, int k) {
	if (T == NULL) {	//原树或子树为空,新插入的结点为根节点
		T = (BSTree)malloc(sizeof(BSTNode));
		T->key = k;
		T->lchild = T->rchild = NULL;
		return 1;	//返回1,插入成功
	}
	else if (k == T->key)	//树中存在相同关键字的结点,插入失败
		return 0;
	else if (k < T->key)	//插入到T的左子树
		return BST_Insert(T->lchild, k);
	else				//插入到T的右子树
		return BST_Insert(T->rchild, k);
}

四、二叉排序树的构造

演示3:按照序列str={57,55,3,94,67,8,4,48,61,75}建立BST:
在这里插入图片描述

不同的关键字序列可能得到同款二叉排序树,也可能得到不同款二叉排序树;
如:
str1={50,66,60,26,21,30,70,68}
str2={50,26,21,30,66,60,70,68}
str3={26,21,30,50,60,66,68,70}

按照str[]中的关键字序列建立二叉排序树(C/C++算法实现):
依次将每个关键字插入到二叉排序树中

void Create_BST(BSTree& T, int str[], int n) {
	T = NULL;	//初始时T为空树
	int i = 0;
	while (i < n) {	//依次将每个关键字插入到二叉排序树中
		BST_Insert(T, str[i]);
		i++;
	}
}

五、二叉排序树的删除

演示4:【情况1-被删除结点是叶节点】删除关键字为32的结点:
在这里插入图片描述

演示5:【情况2-被删除结点只有一颗左子树或右子树】删除关键字为29的结点:
在这里插入图片描述

演示6:【情况3-被删除结点有左、右两棵子树】删除关键字为65的结点(作为叶子节点的直接后继67进行替代):
在这里插入图片描述
演示7:【情况3-被删除结点有左、右两棵子树】删除关键字为65的结点(不作为叶子节点的直接后继67进行替代):
在这里插入图片描述
先搜索找到目标结点:
1、若被删除结点z是叶节点,则直接删除,不会破坏二叉排序树的性质(左子树结点值<根节点值<右子树结点值)。
2、若结点z只有一颗左子树或右子树,则让z的子树成为z父节点的子树,替代z的位置。
3、若结点z有左、右两棵子树,则令z的直接后继(或直接前驱)替代z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转换成了第一或第二种情况。
注:
由于,二叉排序树的性质:左子树结点值<根节点值<右子树结点值;
所以,对二叉排序树进行中序遍历,可以得到一个递增的有序序列;
z的直接后继:z的右子树中最左下结点(该节点一定没有左子树);
z的直接前驱:z的左子树中最右下结点(该节点一定没有右子树);
在这里插入图片描述

六、查找效率分析

查找长度:在查找运算中,需要对比关键字的次数称为查找长度,反映了查找操作的时间复杂度。

计算1:查找成功的平均查找长度ASL(Average Search Length):
在这里插入图片描述

左图:ASL=(1*1+2*2+3*4+4*1)/8=2.625
右图:ASL=(1*1+2*2+3*1+4*1+5*1+6*1+7*1)/8=3.75

若树高 h h h,找到最下层的一个结点需要对比 h h h次;

最好情况: n n n个结点的二叉树最小高度为 ⌊ l o g 2 n ⌋ + 1 ⌊log_2{n}⌋+1 ⌊log2​n⌋+1,平均查找长度ASL= O ( l o g 2 n ) O(log_2{n}) O(log2​n);
最坏情况:每个结点只有一个分支,树高 h h h=结点数 n n n。平均查找长度ASL= O ( n ) O(n) O(n);

所以,发明了平衡二叉树,树上任一结点的左子树和右子树的深度之差不超过1。
在这里插入图片描述

计算2:查找失败的平均查找长度ASL(Average Search Length),需补充失败结点:
在这里插入图片描述

左图:ASL=(3*7+4*2)/9=3.22
右图:ASL=(2*3+3+4+5+6+7*2)/9=4.22

七、C/C++编码实践

为了验证上述C/C++算法代码的准确性,本文采用VS2022进行调试;
1、添加头文件:

#include<stdio.h>
#include<stdlib.h>

2、定义数组大小:

#define MaxSize 50

3、引入二叉树中序遍历的函数:

void visit(BSTree T) {
	printf("%d\t", T->key);
}

void InOrder(BSTree T) {
	if (T != NULL) {
		InOrder(T->lchild);	//递归遍历左子树 
		visit(T);			//访问根节点 
		InOrder(T->rchild);	//递归遍历右子树 
	}
}

4、计算数组实际元素个数的函数:

int getStrCount(int str[]) {
	int i = 0;
	while (str[i] != 0)i++;
	return i;
}

5、把上述二叉排序树的定义、查找、插入、构造算法代码加入,递归和非递归算法选择一种即可;

6、编写main函数进行函数调用并调试:

int main(void)
{
	BSTree tree_p;	//初始化二叉排序树根节点的指针tree_p 
	int tree_str[MaxSize] = { 50,66,66,60,26,21,30,70,68 };	//定义要插入的数据元素数组 
	int tree_count = getStrCount(tree_str);	//获取到数据元素的个数 
	Create_BST(tree_p, tree_str, tree_count);	//创建二叉排序树,将数组里面的数据依次插入并将根节点指针赋值给tree_p  
	InOrder(tree_p);	//根据根节点指针tree_p中序遍历该二叉排序树 
	printf("\n查找元素21,并输出其地址:%p", BST_Search(tree_p, 21));	//调用二叉排序树的查找算法,验证其正确性 
}

免责声明:
1.编写此文是为了更好地学习数据结构,如果损害了有关人的利益,请联系删除;
2.如果文中描述欠妥,请在评论中进行指正;
3.文字编写不易,若感觉有用,点赞收藏关注会让博主很开心哦;
4.此外,本文支持任何形式的转载,转载请注明出处,非常感谢!!!
本文源自:https://blog.youkuaiyun.com/testleaf/article/details/125920156
参考:
https://visualgo.net/zh/bst
https://blog.youkuaiyun.com/qq_38326829/article/details/122016067
https://blog.youkuaiyun.com/qq_30310145/article/details/117333664
https://blog.youkuaiyun.com/Peter_tang6/article/details/76832757

Oracle EBS与SAP数据数据切换至迁移华为MetaERP分析 Oracle EBS到华为MetaERP的数据迁移可采用“表对表复制”思路,因其模块化设计下数据模型标准化、边界清晰。核心业务对象存储在结构明确的主表中,与MetaERP模型兼容度高,便于直接映射。而SAP到MetaERP的迁移则因SAP高度优化的复杂表结构(如簇表/池表)、数据分散冗余、深度依赖配置等特点,无法简单复制,必须采用基于业务对象的迁移方法,通过视图/BAPI提取数据并进行深度转换。两种迁移的本质差异源于源系统的数据模型设计理念不同。 阅读详情

相关推荐

PCIE协议版--M.2接口规范V1.0中文版1——物理规格篇

5.1.3.双模块键模块:同时支持Socket1-DP、Socket1-SD。2.4.7.3.3.双面模块(使用H2.8、H3.2、H4.2连接器)6.5.8.2.5.热设计功率响应-带有风扇类别的薄平台笔记本电脑。2.3.7.1. Socket1&2射频连接器PIN-OUT。5.2.2.Socket2 PIN-OUT(机械KEY B)3.2.10.1.3.极薄的笔记本电脑的电源开关顺序的例子。5.1.1.Socket1-DP(机械KEY A)5.1.2.Socket1-SD(机械KEY E)

想你所想,做你所做 4679

二叉排序树(BST)

二叉排序树的定义 查找操作 插入操作 删除操作 查找效率分析——平均查找长度ASL 平衡二叉树(二叉排序树的引申概念) 二叉排序树的定义 二叉排序树,又称二叉查找树(BST,Binary Search Tree) 一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树: 1、左子树上所有结点的关键字均小于根结点的关键字; 2、右子树上所有结点的关键字均大于根结点的关键字。 左子树与右子树各是一棵二叉排序树。 左子树结点值<根结点值<右子树结点值 如果对二叉排序树进行中序

荒唐的博客 6596

AstrBot插件开发全攻略:从零编写一个天气查询插件(Python实战)

本文提供了一份详细的AstrBot插件开发实战指南,手把手教你使用Python从零编写一个智能天气查询插件。内容涵盖插件系统核心设计、开发环境搭建、API调用与数据处理、自然语言交互实现以及插件打包发布全流程,帮助你快速掌握基于AstrBot框架的聊天机器人功能扩展技能。

weixin_29212867的博客 1084

数据结构-二叉排序树

1.定义 二叉排序树又称为二叉查找树,它或者是一颗空树,或者有以下性质的树: 若它的左子树非空,则左子树上所有结点的值均小于根结点的值 若它的右子树非空,则右子树上所有结点的值均大于根结点的值 左、右子树本身是二叉排序树 2.查找过程 因为二叉排序树的左子树上所有结点的关键字均小于根结点的关键字,右子树上所有结点的关键字均大于根结点的关键字,所以在二叉排序树上进行查找的过程为: ...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 8615

CUPED (Controlled-experiment using Pre-Experiment Data) 论文学习笔记

CUPED是一种用于提升A/B测试灵敏度的方差缩减技术。它通过利用实验前用户行为数据(协变量X)构建调整后的指标Y_cuped=Y-θ(X-E[X]),其中θ=Cov(Y,X)/Var(X)。这种方法能在保持处理效应估计无偏的前提下,将方差降低1-ρ²倍(ρ为前后指标相关性)。CUPED的核心优势在于:不改变平均处理效应的估计,但能显著提升统计功效,使得实验更容易检测到微小但真实的效应,同时减少所需样本量或实验周期。该技术特别适用于用户异质性大、指标方差高的场景。

pursuit的博客 2147

风力摆控制系统 PCB 设计 3 要点:STM32+MPU6050+空心杯电机驱动一体化

本文详细解析了风力摆控制系统PCB设计的3大核心要点,重点介绍STM32主控、MPU6050姿态传感器与空心杯电机驱动的一体化方案。通过系统架构设计、PCB布局布线技巧以及噪声抑制方案,帮助参赛者在电子设计竞赛中构建高精度、高稳定性的风力摆控制系统,提升竞赛作品性能。

weixin_30363285的博客 359

数据结构及算法--二叉排序树

性质 二叉排序树,又称二叉查找树,其为空树,或具有以下性质的二叉树: (1)若其左子树不为空,则左子树上的所有节点的值均小于它的根结点的值; (2)若其右子树不为空,则右子树上的所有节点的值均大于它的根结点的值; (3)左右子树又分别是二叉排序树。 作用:用于查找元素是否在某无序数组中。 如序列[62,58,88,47,73,99,35,51,93,29,37,49...

打酱油的葫芦娃 6858

嵌入式工程师成长之路(7)——算法学习

算法大全1、风仲达——算法笔记2、坐在马桶上学算法3、啊哈算法4、深度强化学习实验室。

云轩阁 4万+

《数据结构》—— 二叉排序树

二叉排序树的定义、查找、插入、构建、删除、查找效率分析。

博樽 5199

【蓝桥杯单片机组第八届省赛】— 基于单片机的电子钟程序设计与调试

1、初赛试题 1.1 基本要求 (1)使用 CT107D 单片机竞赛板, 完成“电子钟” 功能的程序设计与调试; (2)设计与调试过程中,可参考组委会提供的“资源数据包”; (3)Keil 工程文件以准考证号命名, 完成设计后, 提交完整、 可编译的 Keil工程文件到服务器。 1.2 硬件框图 1.3功能描述 1.3.1 初始化 (1)关闭蜂鸣器、继电器等无关外...

Fanjufei的博客 3661

磁悬浮分子泵:起源、现状与未来趋势深度解析

摘要 磁悬浮分子泵作为高真空获取的关键设备,通过磁悬浮技术实现转子无接触高速运转,大幅提升了真空系统的性能和可靠性。本文系统梳理了分子泵从机械轴承到磁悬浮的技术演变历程,分析了当前行业格局及主要厂商产品特性,包括爱德华兹、普发真空等国际巨头的技术优势。研究进一步探讨了磁悬浮分子泵在半导体制造、科研设备等领域的核心应用,通过数学模型揭示了其性能参数关系。最后,展望了未来在智能化、节能化等方面的发展趋势,为相关领域的技术创新提供参考。 关键词:磁悬浮分子泵;高真空技术;半导体制造;科研设备;技术发展

技术工作者 690

二叉排序树

二叉排序树的定义 二叉排序树又称二叉查找树。或者为空树,或者是具有以下性质的二叉树: (1)若它的左子树不为空,则左子树所有节点的值小于根结点, (2)若它的右子树不为空,则根结点的值小于所有右子树结点的值 (3)它的左右子树叶分别为二叉排序树 二叉排序树有一些基本的应用,可以用于查找,查找的长度与树的深度有关。其平均查找长度为logN(以2位底的对数,N为结点个数)。   一个序列...

田野中的锋芒 1909

【基于深度学习的脑电图识别】数据集篇:THE TUH EEG CORPUS: A Big Data Resource for Automated EEG Interpretation

【基于机器学习的脑电图识别】数据集篇:脑电信号自动判读的大数据摘要: 摘要: 这个数据集包括超过 25000 个脑电图研究,包括一个神经学家对测试的解释,一个简短的病人病史和关于病人的人口统计信息,如性别和年龄。这是第一次有足够的数据来支持最先进的机器学习算法的应用。在这篇论文中,我们使用了3762个语料库的会话子集,展示了从原始脑电图信号数据预测脑电图的一些基本属性的初步实验结果。在闭环测试中,...

梁瑛平的博客 5615

二叉排序树详解以及实现

二叉排序树详解以及实现

Keep_Trying_Go的博客 3317

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

7.3 数据结构——二叉排序树

二叉排序树

weixin_45523296的博客 4501

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据结构(34)二叉排序树

目录 1、二叉排序树(BST,Binary Sort Tree)定义 2、二叉排序树的查找 3、二叉排序树的插入 4、二叉排序树的构造 6、二叉排序树的查找效率分析 7、二叉排序树与二分排序对比 1、二叉排序树(BST,Binary Sort Tree)定义 二叉排序树(也称为二叉查找树)或者是一棵空树,或者是具有以下特性的二叉树: 1)若左子树非空,则左子树上所有结点的值均小于根节点的值。 2)若右子树非空,则右子树上所有结点的值均大于根节点的值。 3)左、右子树也分别是一棵二叉排序

李白 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

二叉排序树(BST)--构造二叉排序树

已知一个有序序列,如何构造一个二叉排序树呢?

today2222的博客 9921

数据结构:二叉排序树

2)用结点 p 的直接前驱(或直接后继)来代替结点 p ,同时在二叉排序树中对其直接前驱(或直接后继)做删除操作,简单理解:因为p的左子树的最右端s是p的左子树所有结点关键字中最大的,所以只需用其代替p,然后将s的左子树为其父结点的右子树即可。1)令结点 p 的左子树为其双亲结点的左子树;结点 p 的右子树为其自身直接前驱结点的右子树,简单理解:因为p的左子树所有结点都小于p的右子树结点,所以只需将p的左子树重接在p的父结点的左子树上,然后将p的右子树整体接入p左子树的最右端s即可。

weixin_45652283的博客 1327

5.13 二叉排序树

一、二叉排序树的定义(BST,Binary Search Tree) 【定义】 ​ 一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:①左子树上所有结点的关键字均小于根结点的关键字; ​ ②右子树上所有结点的关键字均大于根结点的关键字; ​ ③左子树和右子树又各是一棵二叉排序树 ​ 【即】左子树结点值 < 根结点值 < 右子树结点值 二、查找操作 【思路】 ​ 若树非空,目标值

qq_45785650的博客 334

数据结构与算法之二叉排序树

二叉排序树,又称二叉查找树 (BST) 一颗二叉树或者空二叉树,或者是具有如下性质的二叉树:左子树结点值

five-five 1510

【算法导论】二叉排序树

二叉排序树 二叉排序树的性质:每个节点的左子树中的所有节点的关键字都小于该节点的关键值,而右子树中的所有节点的关键字都大于该节点的关键值。 二叉排序树的构造 二叉排序树的构造是指将一个给定的数据元素构造为相应的二叉排序树。 基本思想为: 对于任给的一组数据元素{ R1, R2, …, Rn } , 可按以下方法来构造二叉排序树:         (1) 令R1为二叉树的根;

青峰碧陋室 2735

二叉排序树详解

摘要:本篇笔记专门介绍二叉排序树,重点讲解了二叉排序树的特性,以及二叉排序树各方面的基本实现。

云杉木屋 2万+

轻松解决不同关键字序列构成的二叉排序树ASL(平均查找长度)(成功)不同问题

关键字序列1,2,3,4,5构造而得的二叉排序树 ASL=(1,2,3,4,5)/5=3 按关键字3,1,2,5,4构造而得的二叉排序树 ASL=(1+2+2+3+3)/5=2.2 很明显第二种序列的ASL要快。至于二叉排序树怎么构成的其实就是根据它的性质(若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值,若它的右子树不空,则右子树上的所有结点的值均大于它的根结点的值)ASL怎么

浅然的专栏 4万+

数据结构(王道笔记)——二叉树

王道二叉树相关概念,二叉树、满二叉树、完全二叉树、二叉排序树、平衡二叉树、扩充二叉树。二叉树的层序遍历、前序遍历、中序遍历、后序遍历。从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树。线索二叉树,加快查找结点前驱和后继的速度。

lranqi的博客 2160

王道数据结构笔记02-平衡二叉树/平衡树/AVL树

平衡二叉树(BalancedBinaryTree),简称平衡树(AVL树),树上任一结点的左子树和右子树的高度之差不超过1。简称AVL命名来源于其发明者G.M.Adelson-Velsky和E.M.Landis,不要和平均查找长度ASL混淆了。结点的平衡因子=左子树高-右子树高。平衡二叉树结点的平衡因子的值只可能是-1、0或1。只要有任一结点的平衡因子绝对值大于1,就不是平衡二叉树。intkey;//数据域intbalance;.......................................

testleaf.cn 3048
上一篇: 王道数据结构笔记02-平衡二叉树/平衡树/AVL树
下一篇: 2005年软件评测师真题精选
testleaf
博客等级 码龄7年 3515粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

testleaf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值