二叉查找树的插入和删除详解

什么是二叉查找树? 树简介对于树的基本认识,我们很容易通过我们平常所见到的树来理解:一棵树,有一个根,根往上又会分叉出大树枝,大树枝又会分叉出小树枝,以此往复,直到最后是叶子。而作为数据结构... 阅读详情

二叉查找树是如下定义的:

(1)  左子树不空,则左子树上的所有结点的值均小于根结点的值

(2)  右子树不空,则右子树上的所有结点的值均大于根结点的值

二叉查找树可以为空,二叉查找树是递归定义的,也就是说其左右子树也为二叉查找树。

二叉查找树是一种动态查找表,可以进行动态地插入和删除。前面的定义中我们假定二叉查找树不含有相同元素。

由定义可知二叉查找树的中序序列为一个递增序列

常见的二叉查找树操作有求最小元素findMin(),求最大元素findMax(),判断查找树是否非空isEmpty(),判断是否包含给定元素contains(),输出所有元素printTree(),置空查找树makeEmpty(),向查找树中插入给定元素x,insert(x),在查找树中删除给定元素x,remove(x)。

下面先讨论最重要的插入和删除操作,接着给出完整的C风格实现。

1、基本结构定义

class Student
{
	public:
		int key;
		string major;
		Student(int k=int(),string s="") : key(k), major(s){}
		void operator=(const Student& rhs);
};
typedef Student ElementType;
typedef int KeyType;

typedef struct BSTNode
{
	ElementType data;
    struct BSTNode* lchild;
    struct BSTNode* rchild;
}BSTNode, *BST;

详细信息请看后面完整程序

2、插入

(1)  不允许插入相同关键字,若二叉查找树中存在该关键字,则不插入

(2)  我们可以先检索二叉树,看查找树中是否含有该关键字,若不存在,再做一次扫描将结点插入到适当位置。使用这种方式,为插入一个该关键字,做了两次扫描。

(3)  注意到,插入的结点总是作为某一叶子节点的子结点,我们可以在第一次扫描过程中就确定待插入的位置,即把查找是否存在该关键字和查找可能的插入点在一次扫描中完成,提高插入效率。

(4)  查找递归实现

/*
  description:在以t为根结点的二叉查找树中,查找关键字为key的结点
  若查找成功,指针p指向该结点,返回true,
  否则指向查找路径上的最后一个结点并返回false
  指针f指向根结点t的父节点 
*/
bool searchBST_recursion(BST t, KeyType key, BSTNode* f, BSTNode*& p)
{
	if(t == NULL)//查找失败 
	{
		p = f;
		return false;
	}
	else if(key == t->data.key)//查找成功 
	{
		p = t;
		return true;
	}
	else if(key < t->data.key)
		return searchBST_recursion(t->lchild,key,t,p);//左子树中继续查找 
	else 
		return searchBST_recursion(t->rchild,key,t,p);//右子树中继续查找 
}

(5)  查找非递归实现

bool searchBST(BST t, KeyType key, BSTNode* f, BSTNode* &p)
{
	while(t && key != t->data.key)
	{
		f = t;
		if(key < t->data.key)
		{
			t = t->lchild;
		}
		else
		{
			t = t->rchild;
		}			
	}
	if(t)//查找成功 
	{
		p = t;
		return true;
	}
	else
	{
		p = f;
		return false;
	}
}

(6)  插入给定元素

void insertBST(BST& t,ElementType elem)
{
	BSTNode * p = NULL;
	if(!searchBST(t, elem.key, NULL, p))//查找失
数据结构 | 第十四章:搜索树 | 二叉搜索树的查找、插入、删除 《数据结构、算法与应用(C++语言描述)》第十四章:搜索树,结合课程重点的自留笔记。 阅读详情

相关推荐

什么是二叉查找树?看完这篇就懂了

什么是二叉查找树?看完这篇就懂了

hcz666的博客 777

信息学奥赛一本通高手训练1680:序列

题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p

qingfeixueyue的博客 468

手把手教你解决uniapp中esbuild版本冲突问题(Mac版专属指南)

本文是针对Mac平台uniapp开发者的专属指南,详细解析了运行项目时常见的`Cannot start service`错误,即esbuild的Host版本与binary版本不匹配问题。文章从错误根源入手,提供了从快速应急处理到彻底根治的完整解决方案,包括手动替换二进制文件、锁定依赖版本、清理缓存及优化工具链配置,旨在帮助开发者高效解决版本冲突,恢复并稳定开发环境。

i0j1k2l3m的博客 458

智能排班考勤系统原型

可实现从业务预测,到工时预估,再到人员分配全流程自动智能排班。可应用于客服行业或工厂的智能排班系统。

gywm15111336483的专栏 995

Ansys Motor-CAD:概述(EMag、THERM、LAB、MECH)

在这篇博客中,我概述了如何使用 Ansys Motor-CAD 模型、模拟、分析和后处理结果来评估电机性能,并帮助您为您的应用选择优化的电机,并通过电机设计选择实现成本效益和效率。我介绍了各种可用的电机类型、可供选择的物理模块和可配置的多物理选项。E-Mag 物理模块有许多选项卡,涵盖几何创建、材料选择、电磁设置、条件、求解器类型、解决方案模型、耦合设置等的所有设置。热物理模块有许多选项卡,涵盖几何创建、材料选择、热设置、条件、求解器类型、解决方案模型、耦合设置等的所有设置。分析结果的速度相结合。

jkh920184196的博客 1755

Anomalib库安装以及使用

Anomalib是一个专注于异常检测的深度学习库。它的目标是收集最新的异常检测算法,并提供用于在公共和私有数据集上进行基准测试的工具。该库提供了一系列已实现的异常检测算法,这些算法在最近的文献中有所描述。此外,Anomalib还提供了一套工具,方便开发人员开发和实现自定义模型。该库特别注重基于图像的异常检测,旨在识别数据集中的异常图像或图像中的异常像素区域。通过使用Anomalib,用户可以快速构建和评估各种异常检测算法,以满足其特定需求。

mingo_敏 5198

用Python爬取大连商品交易所期货实时行情:从入门到实战

python复制编辑# utils.py"豆粕": "M0","铁矿石": "I0","聚乙烯": "L0","玉米": "C0","聚丙烯": "PP0","棕榈油": "P0"本项目展示了:✅ 如何从新浪财经 API获取主力合约实时数据✅ 使用Python异步爬虫技术) 提升效率✅ 利用pandas和matplotlib进行结构化分析与可视化✅ 具备良好的扩展性,可对接金融、农业、能源等数据需求场景✅ 可作为期货量化策略数据源✅ 可嵌入自动化报告系统。

2201_76125261的博客 1247

【Unity 实用工具篇】 | 滚动列表插件FancyScrollView,快速上手使用

FancyScrollView 是一款专为Unity引擎开发的高效滚动列表组件。它具有轻量级、可定制性强、性能优秀等特点。 使用FancyScrollView插件进行Unity项目开发,可以极大提升开发效率,尤其是在需要大量列表展示的场景下,如商城、目录列表、角色选择界面等。开发者可以将注意力集中在业务逻辑的实现上,而将界面渲染和交互部分交由FancyScrollView处理。 本文来介绍一下FancyScrollView的功能展示和基本使用方法。

努力前行,总会成为自己心中的那道光 3万+

★教程1:matlab学习教程入门100例目录

★基础入门 1.为什么要学习MATLAB 2.MATLAB安装 持续更新....... ★MATLAB基础编程语言熟悉

FPGA/MATLAB学习教程/源码/项目合作开发 4万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: KMP算法
下一篇: 二叉树的非递归遍历及层次遍历
sysu_arui
博客等级 码龄14年 57粉丝 38原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值