数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)

news2024/12/24 2:58:33

目录

二叉搜索树

二叉搜索树的一些操作函数 

二叉搜索树的查找操作Find

递归实现

迭代实现 

查找最大和最小元素

查找最小元素的递归函数

查找最大元素的迭代函数 


二叉搜索树

二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。

一颗二叉树,可以为空;如果不为空,满足一下性质:

1.非空左子树的所有键值小于其根节点的键值。

2.非空右子树的所有键值大于其根节点的键值。

3.左、右子树都是二叉搜索树。

 

二叉搜索树的一些操作函数 

  • Position Find (ElementType x,BinTree BST);

从二叉搜索树BST中查找元素x,返回其所在节点的地址。

  • Position FindMin(BinTree BST);

从二叉搜索树BST中查找并返回最小元素所在节点的地址。

  • Position FindMax(BinTree BST);

从二叉搜索树BST中查找并返回最大元素所在节点的地址。

  • BinTree Insert(ElementType x,BinTree BST);

在二叉搜索树BST中插入一个值为x的节点。

  • BinTree Delete(ElementType x,BinTree BST);

在二叉搜索树BST中删除值为x的节点。

二叉搜索树的查找操作Find

二叉搜索树的查找思路很简单:

查找从根节点开始,如果树为空,返回NULL;

若搜索树非空,则根节点关键字和x进行比较,并进行不同处理:

  1. 若x小于根节点键值,只需在左子树中继续搜索;
  2. 若x大于根节点键值,则在右子树中进行继续搜索;
  3. 如果两者比较的结果是相等,搜索完成,返回指向此节点的指针。

递归实现

使用递归的方法实现的话,代码很简单,直接判断键值大小,进行尾递归。(即在程序要返回值时进行递归)

Position Find(ElementType x,BinTree BST)
{
	if (!BST)
	{
		return NULL;  //为空则查找失败
	}
	if (x > BST->data)
	{
		return Find(x, BST->Right);  //在右子树中继续查找
	}
	else if (x < BST->data)
	{
		return Find(x, BST->Left);   //在左子树中继续查找
	}
	else   //x == BST->data
	{
		return BST;                  //查找成功,返回结点地址
	}
}

但递归实现的方法效率不是很高,从编译的角度来看,尾递归可以用循环的方式来实现了。

所以我们将递归函数改为迭代函数

迭代实现 

 与递归函数同样的一步是,先判断节点是否为空,为空表示查找失败,非空则开始查找;

如果x的值大于根节点,就将节点的指针指向右子树继续循环查找;

如果x的值小于根节点,则将节点的指针指向左子树继续循环查找;

如果相等,则说明查找成功了。

Position IterFind(ElementType x, BinTree BST)
{
	while (BST)
	{
		if (x > BST->data)
		{
			BST = BST->Right;    //向右子树中移动,继续查找
		}
		else if (x < BST->data)
		{
			BST = BST->Left;     //向左子树中移动,继续查找
		}
		else
		{
			return BST;          //查找成功,返回结点地址
		}
	}
	return NULL;                 //查找失败
}

但是这个查找的效率决定于树的高度。

如果二叉搜索树排成了一条链,即斜二叉树,他的这颗树的高度就为n-1,这样最坏的情况下要找到一个节点就需要n-1次了。算法的时间效率就只有O(N)了,而达不到我们想要的log2n,要解决这个问题就要涉及到以后要讲的平衡二叉树了。

查找最大和最小元素

因为二叉搜索树的特殊性,比根节点小的在左子树,比根节点大的在右子树。

所以,

最大元素一定是在树的最右分枝的端节点上; 最小元素一定是在树的最左分枝的端节点上。

 

函数的代码实现也没什么难点,按照思路,在递归的方法实现中(查找最小元素):节点的左子树不为空就进行递归,直到某一个节点的左子树为空就返回。

查找最小元素的递归函数

Position FindMin(BinTree BST)
{
	if (!BST)
	{
		return NULL;                  //空的二叉搜索树,返回NULL
	}
	else if (!BST->Left)
	{
		return BST;                   //找到最左的叶节点并返回
	}
	else
	{
		return FindMin(BST->Left);    //沿左分支继续查找
	}
}

在迭代的方法实现中:直接走到最左端或者最右端的节点即是最小元素或者最大元素。

查找最大元素的迭代函数 

Position FindMax(BinTree BST)
{
	if (BST)
	{
		while (BST->Right)
		{
			BST = BST->Right;  //沿右分支一直查找,直到最右叶节点
		}
	}
	return BST;
}

end


学习自:MOOC数据结构——陈越、何钦铭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解 Hugging Face 中的生成工具:Generate方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SSH升级

升级openssh版本一、安装telnet远程管理主机1、检查是否安装telnet2、安装telnet服务二、下载所需的安装包1、下载openssl、openssh、zlib安装包2、安装所需的相关软件3、备份原来的数据4、复制文件到/usr/local/bin/下增加执行权限一、安装telnet远程管理主机 1、检查是否安装…

通达信口袋支点选股公式编写和设置方法答疑

1、口袋支点选股公式成交量条件 在我编写的口袋支点选股公式中&#xff0c;成交量条件为成交量创10日新高。有网友提出&#xff0c;根据书中的定义&#xff0c;口袋支点成交量条件是成交量大于近10日下跌时的最大成交量。 这个问题确实是我没考虑周全&#xff0c;成交量创10日…

【5G NAS】NR 终端侧PDU建立过程以及数据包的过滤和映射

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

对数据去趋势

对数据去趋势 测量的信号可能显示数据中非固有的整体模式。这些趋势有时会妨碍数据分析&#xff0c;因此必须进行去趋势。 以具有不同趋势的两种心电图 (ECG) 信号为例。ECG 信号对电源干扰等扰动很敏感。加载信号并绘制它们。 load(ecgSignals.mat) t (1:length(ecgl));su…

LaTeX+Overleaf 论文速通教程

一、文本/排版二、章节和段落三、数学公式四、插入图片五、插入表格六、参考文献与交叉引用不使用BibTeX使用BibTeX(推荐)七、交叉引用label和refOverleaf开发界面 latex命令&#xff1a;\命令[可选参数]{必选参数} Latex项目组成&#xff1a; .tex&#xff1a;正文 .bib&…

如何对数据库进行优化

数据库是什么&#xff1f; 简单来说数据库就是将数据按照一定顺序存储到磁盘上的一个软件&#xff0c;我们平时写的sql语句&#xff0c;就是用数据库软件能识别的语言&#xff0c;对数据进行增删改查。其实数据本质上是不存在表里&#xff0c;而是存在磁盘上&#xff0c;所谓的…

掌握亚马逊,沃尔玛,东南亚平台的测评要点,测评事半功倍

测评其实最重要的两个点就是自己的资源和成号率 资源包括;商家资源&#xff0c;中介资源&#xff0c;礼品卡资源&#xff0c;还有买卖账号的渠道&#xff0c;ip资源 成号率这个直接影响的就是你个人投入成本的多&#xff0c;成号率越高&#xff0c;你的成本越低&#xff0c;但…

【Java版oj】day36Rational Arithmetic、Pre-Post

目录 一、Rational Arithmetic &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、Pre-Post &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、…

十七、小程序报错 真机调试预览失效 Error: Illegal Buffer

报错 电脑端微信开发者工具运行成功而真机调试预览失效 报错 MiniProgramError Illegal Buffer 报错 {errno: 600001, errMsg: “request:fail -200:net::ERR_CERT_COMMON_NAME_INVALID”} 前言&#xff1a;手头有个去年的微信小程序项目 年底甲方不在使用 所以停掉了服务器、…

互联网医院系统构建:探索开源云平台与互联网医院平台源码的融合

互联网医院系统作为一种新型医疗服务模式&#xff0c;将传统的医院门诊转化为在线咨询、远程会诊等形式&#xff0c;帮助患者更加方便地获得专业医疗服务。 在实现互联网医院系统的建设过程中&#xff0c;选择合适的云平台和医院平台源码是至关重要的。 首先&#xff0c;开源…

LVM逻辑卷管理

目录一、LVM简介1、逻辑卷管理磁盘的优点2、缺陷3、LVM概述图二、LVM的使用1、创建逻辑卷2、使用逻辑卷3、删除逻辑卷4、LVM扩容5、LVM缩容三、Snapshot&#xff08;快照功能&#xff09;1、LVM-snapshot简介2、利用snapshot做备份&#xff08;LV快照&#xff09;四、LVM数据迁…

整型在内存中的存储

在计算机底层&#xff0c;所有数据最终都会被表示为二进制形式。整型也不例外。本文将介绍在C语言中如何定义和操作整型变量&#xff0c;并解释整型在内存中的存储方式。 整型变量的定义和使用 在C语言中&#xff0c;可以用int关键字来定义一个整数型变量。例如&#xff1a; …

ChatGPT们接踵而至,AI会彻底改变我们的工作方式吗?

2023年开年&#xff0c;AI成为了舞台上聚光灯下的主角&#xff0c;AI 浪潮不仅让我们对人工智能的能力有了一次全新的理解&#xff0c;而且所有人的工作和生活都将受到不同程度的影响。 ChatGPT、Notion AI、New Bing、GPT-4、MidJourney v5、office copilot、Adobe Firefly、…

解决方案:炼丹师养成计划 Pytorch如何进行断点续训——DFGAN断点续训实操

我们在训练模型的时候经常会出现各种问题导致训练中断&#xff0c;比方说断电、系统中断、内存溢出、断连、硬件故障、地震火灾等之类的导致电脑系统关闭&#xff0c;从而将模型训练中断。 所以在实际运行当中&#xff0c;我们经常需要每100轮epoch或者每50轮epoch要保存训练好…

Python实现哈里斯鹰优化算法(HHO)优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

DAY 43 Apache的配置与应用

虚拟Web主机 概述 虚拟web主机指的是在同一台服务器中运行多个web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务器&#xff0c;因此被称为"虚拟"web主机。通过虚拟web主机服务可以充分利用服务器的硬件资源&#xff0c;从而大大降低网站构建及运行成本…

TensorFlow 决策森林详细介绍和使用说明

使用TensorFlow训练、调优、评估、解释和部署基于树的模型的完整教程 两年前TensorFlow (TF)团队开源了一个库来训练基于树的模型&#xff0c;称为TensorFlow决策森林(TFDF)。经过了2年的测试&#xff0c;他们在上个月终于宣布这个包已经准备好发布了&#xff0c;也就是说我们…

在android项目上集成libyuv库以及使用linyuv库完成camera的缩放,旋转,翻转,裁剪操作

目录 一、下拉google官方的libyuv库代码 二、在android项目中集成libyuv库 1.环境配置 2.拷贝libyuv源码文件 ​编辑3.配置cmake libyuv相关的链接编译等 三、使用libyuv库 1.libyuv库完成camera的旋转 2.libyuv库实现翻转 3.libyuv库实现缩放 4.libyuv库实现裁剪 一…

为什么重视安全的公司都在用SSL安全证书?

我们今天来讲一讲为什么重视安全的公司都在用SSL证书 SSL证书是什么&#xff1f; SSL安全证书是由权威认证机构颁发的&#xff0c;是CA机构将公钥和相关信息写入一个文件&#xff0c;CA机构用他们的私钥对我们的公钥和相关信息进行签名后&#xff0c;将签名信息也写入这个文件…