动态查找之二叉排序树,C++代码实现

从OJ题到实战:手把手教你用C++实现二叉排序树的查找(附完整代码与避坑点) 本文详细介绍了如何使用C++实现二叉排序树(BST)的查找功能,从理论到实战逐步解析。内容包括BST节点的定义、插入操作、中序遍历以及查找操作的实现,特别强调了常见错误和调试技巧,并附完整代码示例。适合数据结构和算法学习者提升实战能力。 阅读详情
#include <iostream>
using namespace std;
typedef struct BSTNode
{
	int key;
	struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
//二叉排序树的插入——递归实现
void InsertBST(BSTree &DT,BSTNode *p)
{
	if(DT==NULL)
		DT=p;
	else if((DT->key) > (p->key))
		InsertBST(DT->lchild,p);
	else
		InsertBST(DT->rchild,p);
}
//二叉排序树结点的删除
void DeleteBST(BSTree &DT,BSTNode *p)
{//要删除结点p,f是p的双亲
	BSTNode *f;
	BSTNode *q,*fq;
	if(!(p->lchild)&&!(p->rchild))//第一种情况:p是叶子结点
	{
		if(f->lchild==p)//p是左孩子
			f->lchild=NULL;
		else//p是右孩子
			f->rchild=NULL;
		q=p;
	}
	else if(!(p->rchild))//第二种情况:(1)p只有左子树
	{
		if(f->lchild==p)
			f->lchild=p->lchild;
		else
			f->rchild=p->lchild;
		q=p;
	}
	else if(!(p->lchild))//第二种情况:(2)p只有右子树
	{
		if(f->lchild==p)
			f->lchild=p->rchild;
		else
			f->rchild=p->rchild;
		q=p;
	}
	else //第三种情况:p既有左子树又有右子树
	{//用p的中序后继来代替p
		fq=p;//fq是q的双亲
		q=p->lchild;
		while(q->lchild)
		{//遍历找到p的中序后继
			fq=q;
			q=q->lchild;
		}
		p->key=q->key;
		if(fq==p)
			fq->rchild=q->rchild;
		else
			fq->lchild=q->rchild;
	}
	delete q;
}
//二叉排序树的构造
void CreateBST(BSTree &DT,int n)
{
	int i,j;
	int r[100];
	BSTNode *s;
	DT=NULL;//这里一定要将DT置空,表示刚开始的时候是空树,不置空的话,编译器分配的DT是非空的
	for(j=0;j<n;j++)
		cin>>r[j];
	for(i=0;i<n;i++)
	{
		s=new BSTNode;
		s->key=r[i];
		s->lchild=NULL;
		s->rchild=NULL;
		InsertBST(DT,s);
	}
}
//二叉排序树的搜索——递归实现
BSTNode * SearchBST(BSTree &DT,int k)
{
	BSTNode *p;
	p=DT;
	if(DT==NULL)
		return NULL;
	else if(p->key==k)
		return p;
	else if(p->key>k)
		return SearchBST(p->lchild,k);
	else
		return SearchBST(p->rchild,k);
}
void main()
{
	freopen("in.txt","r",stdin);
	BSTree DT;
	BSTNode *p;
	int k;
	CreateBST(DT,13);
	cin>>k;
	p=SearchBST(DT,k);
	cout<<p->key<<endl;
	//DeleteBST(DT,p);
}

这个二叉排序树不难,可是我有一个地方不太明白,就是二叉排序树结点的删除,首先删除某个结点,一定要知道结点的位置吧,也就是要查找表才能确定你所删除元素的位置,其次结点的删除需要用到被删除结点的双亲,要说那个结点吧,查找一下就能找到那个结点的位置,可是要找它的双亲,就比较困难了啊,难道还得修改查找的算法,让它也能找到某个结点的双亲?总之这个程序还不是很完美,我还得继续改进这个程序!

数据结构07:查找[C++][朴素二叉排序树BST] 考研笔记整理8k+字,小白友好、代码可跑,请小伙伴放心食用~~🥝🥝 阅读详情

相关推荐

数据结构07:查找[C++][平衡二叉排序树AVL]

考研笔记整理1w+字,小白友好、代码可跑,请小伙伴放心食用~~🥝🥝

weixin_42789937的博客 1226

动态查找表 || 二叉排序树的c++实现

二叉排序树的特性: 若左子树不空,左子树上所有结点的值均小于它的根结点值。 若右子树不空,右子树上所有结点的值均大于它的根结点值。 左右子树分别为二叉排序树。 删除算法: 被删除的结点是叶子结点。 被删除的结点只有左子树或有右子树。 被删除的结点既有左子树又有右子树。 对于第三种我们选择删除结点的左子树的最右结点。 查找性能的分析: (平均查找长度) 不同树的平均查找长度不同,即使是相同序...

perry0528的博客 514

Buck的振铃实验与分析

上上期我们提到了buck电路的开关的振铃波形,本质原因是LC的阻尼振荡。文章偏理论,那BUCK到底是怎么产生尖峰振荡呢? 要想把这个问题搞清楚,也很是不容易,所以文章有点长,请直接点赞转发加收藏。 问题 本期主要分析以下这两个问题: 1、死区时间是什么?这里有个小台阶是什么情况? 2、上下尖峰振荡是如何产生的?跟哪些因素有关? 理想的BUCK的SW波形 我们由浅入深,一步一步来,先看理想的开关SW波形—没有尖峰电压的波形。 为了能更好的看buck电路各个点的电压电流情况.

weixin_42005993的博客 3万+

二叉排序树C++实现

二叉排序树定义 二叉排序树又称二叉查找树,它或者是一棵空的二叉树,或者是具有下列性质的二叉树: (1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值; (2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值; (3)它的左右子树也都是二叉排序树。 树节点类定义 //树节点类 class TNode { public: int data; TNode* left, * right; TNode(int d) :left(nullptr), right(nullptr), d

My_Algorithm的博客 2066

手把手教学:利用AutoDL与vLLM快速部署DeepSeek-R1大模型实战指南

本文详细介绍了如何利用AutoDL平台和vLLM框架快速部署DeepSeek-R1大模型的实战指南。从服务器配置、vLLM安装优化到模型部署的两种方案,再到性能调优和生产环境建议,手把手教你高效完成大模型部署。特别针对国内开发者遇到的网络问题提供了稳定解决方案,并分享了显存优化、磁盘清理等实用技巧。

weixin_42531779的博客 327

延迟相乘叠加求和 DMAS (Field II 仿真代码)

(Delay Multiply and Sum, DMAS)算法,最初是为雷达微波系统设计的,研究者们对 DMAS 波束合成方法进行了修改,并应用超声成像。结果表明,DMAS 波束合成在模拟和实验中的表现都优于传统的延时叠加(Delay and Sum, DAS),这种新方法带来的主要改进是对比度分辨率明显提高(即主瓣和侧瓣更窄),从而增加了动态范围,提高了 B 型超声图像质量。与传统 DAS 相似,DMAS 算法通过对来自超声换能器阵元的信号应用几何计算延迟来聚焦接收到的波束。

weixin_38452364的博客 3083

用c++ 实现的二叉排序树(含源代码)

/*以下是用c++ 实现的二叉排序树的源代码*/#includetypedef struct TreeNode { int key; struct TreeNode *left; struct TreeNode *right; }treeNode;class BiSortTree{public:    BiSortTree(void); void desplayTree(void);//显

lzq_student的专栏 3089

H3C设备VRF配置实战:5步搞定多业务网络隔离(附排错技巧)

本文详细介绍了在H3C设备上配置VRF(虚拟路由转发)实现多业务网络隔离的实战方法。通过五步配置流程,从创建VPN-instance、绑定接口到配置独立路由表,帮助网络工程师在单台设备上构建逻辑隔离的企业级网络,并分享了高级路由配置与常见排错技巧。

gold8的专栏 937

二叉排序树实现动态查找

二叉排序树实现动态查找

m0_71819746的博客 208

ZEMAX学习 6.一个照相物镜的设计

曲线越平滑表示场曲越小,曲线越接近水平,系统边缘与中心对比度越接近,虚实越接近表示色差和色散越好;第1个面设计不合理,出现前后表面相交的情况,点击第1面厚度,选择边缘厚度,设置为0.1,第1面厚度被控制在0.1mm厚,系统根据这一设置始终保持第1面边缘厚度为0.1mm。要求:设计一个照相物镜,焦距f=9mm,F#为4,视场角40°;添加有效焦距操作数EFFL 9mm 权重为1,设置优化变量,如下图,ctrl+shift+o打开优化界面。报告中系统数据有效焦距为67.381mm,设计要求为9mm;

qq_24542783的博客 4711

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的全过程。针对数据不满足正态性和方差齐性假设时,如何通过秩转换、回归调整残差,并最终利用Kruskal-Wallis检验完成组间比较。该方法为处理含协变量的非参数多组比较问题提供了清晰的实战解决方案,并探讨了其与标准Quade检验的异同及适用场景。

weixin_29306317的博客 357

数据结构(22)--动态查找之二叉排序树(二叉查找树)

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社 本文中的代码可从这里下载:https://github.com/qingyujean/data-structure 1.动态查找表 特点:表结构在查找过程中动态生成。 要求:对于给定值 key, 若表中存在其关键字等于 key的记录,则查找成功返回,并且对查找成功的关键字可做删除操作;查找失败则可以做插入关键字等于 key的记录的...

小白的专栏 6969

Livox激光雷达传感器在Python3中的完整驱动程序:深入剖析OpenPyLivox库的实现和应用

当我们提到激光雷达或激光扫描技术时,Livox激光雷达传感器无疑是业界的佼佼者。尽管Livox提供了基于C++的官方软件和API,但现在,有了OpenPyLivox (OPL) 库,Python开发者们也能够轻松地接入和控制这些高级的激光雷达设备。

qq_38334677的博客 1002

动态查找表之二叉排序树(BST)的 创建、查找、插入与删除

动态查找表之二叉排序树(BST)的 创建、查找、插入与删除 数据结构与算法

Just Do IT ! 6883

《从理念到落地:Claude Code 在真实项目中的深度实践指南》基于 Anthropic 团队内部使用经验的扩展与深度解读,一篇面向工程团队的全面实践手册

Claude Code 支持通过# 创建新的 API 端点根据以下输入创建完整的 API 端点:资源名称:$ARGUMENTS请创建以下文件:1. `src/routes/{resource}.routes.ts` - 路由定义2. `src/controllers/{resource}.controller.ts` - 控制器3. `src/services/{resource}.service.ts` - 服务层。

AI天才研究院 484

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

二叉排序树的定义及基本操作(构造、查找、插入、删除)递归及非递归算法

文章目录二叉排序树的定义二叉排序树的查找二叉排序树的插入二叉排序树的构造二叉排序树的删除 二叉排序树的定义 二叉排序树(Binary Sort Tree, BST),也称二叉查找树。 二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树: 1) 若左子树非空,则左子树上所有结点关键字均小于根结点的关键字值; 2) 若右子树非空,则右子树上所有结点关键字均大于根结点的关键字值; 3) 左、右子树本身也分别是一棵二叉排序树。 由定义可知,二叉排序树是一个递归的数据结构,可以方便的使用递归算法对二叉排序树

薛定谔的猫的博客 4万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

动态查找表--二叉排序树的实现

动态查找表的特点是表结构本身是在查找过程中动态生成的。二叉排序树的定义是:或者是一颗空树,或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左右子树也分别是

记录我即将到来的一年 2045

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SAP B1中文培訓教材_SDK

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

 二叉排序树c++代码及原理(插入、删除、查找、创建)

二叉排序树 二叉排序树又称“二叉查找树”、“二叉搜索树”。 二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3. 它的左、右子树也分别为二叉排序树。 二叉排序树通常采用二叉链表作为存储结构。中序遍历二叉排序树可得到一个依据关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即是对无序序列进行排序的过程。每次插入的.

时间虚掷的孤岛 2333

【数据结构】— —查找(折半查找,二叉排序树)

【数据结构】— —查找(折半查找,二叉排序树)

shsjssnn的博客 1846

动态查找之二叉查找树(查找) c++实现

算法思想 二叉搜索树(又称二叉查找树或二叉排序树)BST树 二叉查找树   二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3) 任意节点的左、右子树也分别为二叉查找树; ...

hopegrace的博客 1097

静态树表查找算法及C语言实现,动态查找-二叉排序树介绍与实现

1. 算法简介二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。该树属于一种输入数据就默认产生一种顺序的数据结构,这不像本章前面的内容所描述的静态的在某一个数据段内进行查找,动态查找是一种输入时就会自动对其进行排序的数据结构,前文学过的STL中的set集合其底层就是一个类似的树形结构红黑树。2. 定义二叉排序树有以下性值:a) ...

weixin_33212421的博客 540

【C++】二叉排序树相关操作的实现

【C++】二叉排序树 (写在前面:这是数据结构课程作业,仅供学习参考) (1)二叉排序树的定义 二叉排序树或是空树,或是具有下述性质的二叉树:其左子树上所有结点的数据均小于根结点的数据值;右子树上所有结点的数据值均大于或等于根结点的数据值。左子树和右子树又各是一棵二叉排序树。 在二叉排序树中,若按中序遍历就可以得到由小到大的有序序列,如图2.41中的二叉排序树,中序遍历可得到有序序列{2,3,4,8,9,9,10,13,15,18,21}。 (2)二叉排序树的生成 二叉排序树是一种动态表结构,即二

qq_45870566的博客 941

二叉排序树(二叉搜索树)的构建

二叉排序树(也叫二叉搜索树、二叉查找树)满足对树上任意一个结点,数值必定大于等于其左子树上任意结点的数值,必小于等于其右子树上任意结点的数值。 构建二叉排序树的方法: 对于插入的数据x 1.若当前树为空,则x为其根结点。 2.若x小于当前结点,则插入其左子树。若x大于当前结点,则插入其右子树。 若对二叉排序树进行中序遍历,那么其遍历结果必然是一个递增序列,这也是二叉排序树名字的由来。 ...

sanmuyang123的博客 1万+

C++——算法基础之动态查找表1——二叉排序树

C++,算法,二叉树

暮雨灬倾晨~~~的博客 1067

查找系列之二叉排序树

二叉排序树的创建、查询、插入与删除  一、简述二叉排序树的思想:       动态查找表中主要有二叉树结构和树结构两种,而二叉树结构分为二叉排序树和平衡二叉树,树结构分为B-树和B+树等。        二叉排序树可以是一颗空树二叉排序树的性质:二叉排序树上的节点满足左子树        也就是说二叉排序树必须有顺序,且满足左子树 二、构建二叉排序树         创建二叉排序树通常

Rob-Code 1596

二叉排序树的实现

二叉排序树(Binary Sort Tree)又称二叉查找树。  它是一棵空树,或者是具有下列性质的二叉树:  (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;  (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;  (3)左、右子树也分别为二叉排序树; 二叉排序树是一种动态树表。 vs2008运行正确,如有误,请各位大牛指正! 实现代码如下:

1902
上一篇: 静态查找的方法:顺序查找、对半查找、分块查找,C++代码实现
下一篇: 哈希表——开哈希表和闭哈希表
hackerain
博客等级 码龄16年 753粉丝 220原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值