树表查找之二叉排序树

树表的查找 --- 二叉排序树 本期通过二叉排序数的定义进行描述与讲解,并结合相关的算法思想进行讲解,并描述相关算法实现的步骤,使大家更加清晰地了解算法地思想 阅读详情
首先介绍下基本概念:二叉排序树是一棵二叉树,或者为空,或者满足以下条件:

        ①若左子树不空,则其上的值均小于根的值;

        ②若右子树不空,其上的值均不小于根的值;

        ③左右子树也是二叉排序树

 

下面以基本的构造二叉排序树和查找其中的元素来说明其基本的算法。

1、构造

       构造的基本思想:假设已存在一棵二叉排序树,需要向其上添加元素。方法是新建一个指向node类型的

指针,将key装入该指针指向的区域,然后遍历二叉排序树以寻找到合适的位置,将新建节点链接上。至于如

何寻找合适位置,则是根据二叉排序树的特点,在左右子树不断寻找,直到找到一个合适的NULL位置。详见

代码。

2、查找

       先比较根节点的关键字与待查元素的大小关系。如果相等,则表明查找到,查找结束;否则,如果前者大

于后者,则在左子树中查找;否则,在右子树中查找。

                  代码如下:

#include<iostream>
using namespace std;

struct node   //节点包含一个关键字和左右两个指向节点的指针
{
	int key;
	node *lchild;
	node *rchild;
};

class bin_search_t  //二叉排序树类
{
public:
	bin_search_t();
	void insert(node *&T,node *u);
	void create_bst(node *&T);
	node* visit(node *T,int value);

	node *root;
};
bin_search_t::bin_search_t()
{
	root=NULL; //root为NULL决定了insert()和create_bst()都得用root的引用
}

void bin_search_t::insert(node *&T,node *u)  //将u指示的节点元素插入到以T为根的排序树中
{
	if(T==NULL)  //每次都是在空处链接
		T=u;
	else if(u->key>T->key)
		insert(T->rchild,u);
	else
		insert(T->lchild,u);
}

void bin_search_t::create_bst(node *&T)  //需要引用,因为下面有T=NULL语句,不引用就无法从root处访问了
{
	node *u=NULL;

	const int MAX=9999; //标志构造结束
	int x;

	while(1)  
	{
		cin>>x;
		if(x==MAX) break;

		u=new node;  
		u->key=x;
		u->lchild=NULL;
		u->rchild=NULL;

		insert(T,u);	
	}
}

/*递归查找*/
node* bin_search_t::visit(node *T,int value)
{
	if(T==NULL || T->key==value )  //把T==NULL放在前面会省去很多麻烦,因为当T==NULL时,T->key会出错
		return T;
	else if(T->key>value)
		return visit(T->lchild,value);
	else
		return visit(T->rchild,value);
}

/*
非递归查找
node* bin_search_t_n::visit(node *T,int value)
{
	node *p=T;

	while(p!=NULL)
	{
		if(p->key==value)
			return p;
		else if(p->key>value)
			p=p->lchild;
		else
			p=p->rchild;
	}

	return p;
}
*/

int main()
{
	bin_search_t p;
	node *q;

	p.create_bst(p.root);
	q=p.visit(p.root,9);   //以查找9为例

    cout<<q<<endl;     //输出9的位置
	if(q!=NULL)        //根据是否查找的,输出
	    cout<<q->key<<endl;
	else
		cout<<"q==NULL"<<endl;

	return 0;
}

 

数据结构-查找-树表(二叉排序树)查找-科班学习笔记 数据结构-查找-树表查找-详细学习笔记 本篇为查找的第二篇,相关基础概念参考第一篇 查找1 树表的查找是基于二叉排序树的,先来看看二叉排序树是什么 二叉排序树(Binary sort tree) 又称二叉查找树,也称二叉搜索树,它的特征是 若它的左子树非空,则左子树上所有结点值(指关键字值)均小于根结点值; 若它的右子树非空,则右子树上所有结点值均大于根结点值; 左、右子树本身又各是一棵二叉排序... 阅读详情

相关推荐

详解机器人标定

这里是机器人在取料之前,先把自己的角度补正到与 物料当前角度一致,到(X’,Y’)位置处,然后移动 CDx,Cdy,与物料位置也重合,然后去取料。可以使用实物标定,机器人抓住工件摆放9个位置,得到9个机械坐标,相机也得到9个像素坐标,(机器人每次需要回到固定位置拍照),然后标定。(X0,Y0)为旋转中心, (X1,Y1)及(X2,Y2)为工件在视野中旋转角度a的前后坐标,(Xt,Yt)为两点连线的延长。(rx0, ry0)为旋转中心,( x, y)为被旋转的点,(x0,y0)旋转后的点。

weixin_56819992的博客 7633

二叉排序树

文章目录二叉排序树的定义结点定义二叉排序树的操作创建查找插入删除 二叉排序树的定义 二叉排序树,又叫二叉查找树,如果非空,则具有以下性质: 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 它的左右子树也分别为二叉排序树。 由定义可得出 二叉排序树的一个重要性质: 中序遍历该二叉树可以得到一个结点值递增的有序序...

LLM & Fuzzing & Security Lab 1897

Doris StreamLoad任务报错Connection reset

背景 Spark程序扫一张Hive表(大小3-7G),然后用http协议的streamLoad任务提交给Doris集群,在Doris集群从0.13.15升级到0.14.12后spark程序报错streamLoad时突然会Connection reset 分析 enable_http_server_v2 这个参数可以参考FE中文配置中查看到,作用是对于Doris界面是否开启新风格的界面,但是实际上他的作用远不止如此,请接着看 新老版本对于enable_http_server_v2参数默认值是不同的 在0.13

gaofeng的博客 3310

如何从二叉搜索树中查找某个节点、以及记录查找路径

一,题目: 题目链接:力扣https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/ 235. 二叉搜索树的最近公共祖先 难度简单825收藏分享切换为英文接收动态反馈 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也

Morning Sunshine的IT技术博客 3259

Spring Boot与Apache Ignite集成:构建高性能分布式缓存和计算平台

Apache Ignite是一个高性能的分布式内存计算平台,支持内存缓存、分布式计算、流处理和机器学习等功能。它提供了低延迟的数据访问和强大的计算能力,适用于需要高性能和可扩展性的应用。将Apache Ignite集成到Spring Boot应用中,可以显著提高应用的性能和可扩展性。Spring Boot的简单配置和Ignite的强大功能相结合,使得开发和部署更加高效。首先,创建一个新的Spring Boot项目。可以通过Spring Initializr(https://start.spring.io/)

九天的专栏 2148

详细解释xilinx源语的使用:IDELAYE2和IDELAYE3

/ 完整的数据位对齐模块input wire dqs, // 数据选通input wire [7:0] dq_in, // 8位数据输入output wire [63:0] data_out // 并行数据输出// 延迟控制信号// 每个数据位都需要独立的IDELAYgenvar i;i < 8;// IDELAYE2实例.IDELAY_VALUE (10), // 初始值。

baidu_34971492的博客 441

【数据结构(33)】7.3 树表的查找

严蔚敏版【数据结构】7.3 树表的查找:1. 二叉排序树:二叉排序树的定义、二叉排序树的查找算法、二叉排序树的插入、二叉排序树的构造、二叉排序树的删除。2. 平衡二叉树:平衡二叉树的定义、平衡二叉树 的调整方法、构造平衡二叉树。

shangguanxiu的博客 1196

KCP(快速可靠UDP)——用带宽换延迟的极致艺术

想象你是一个外卖平台的调度员。这就是KCP的本质——

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 205

树表的查找

二叉排序树不一定是平衡二叉树。

m0_63783532的博客 1315

Simulink开发项1000例实战专栏--实例38:基于Simulink的周波变换器(Cycloconverter)

需求分析周波变换器(Cycloconverter),也称为频率变换器或直接变频器,是一种将输入的固定频率交流电直接转换为不同频率的交流电的电力电子设备。它广泛应用于工业领域,如大功率电机驱动、风力发电、船舶推进系统等场合。与传统的间接变频器(如交-直-交变频器)相比,周波变换器具有更高的效率和更简单的结构,适用于需要低频输出的应用场景。

xiaoheshang_123的博客 335

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

算法大师! 1123

数据结构(七)——树形查找

平衡二叉树AVL:插入/删除很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),再进行LL/RR/LR/RL调整红黑树RBT:插入/删除很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即便需要调整,一般都可以在常数级时间内完成平衡二叉树:适用于以查为主、很少插入/删除的场景红黑树:适用于频繁插入、删除的场景,实用性更强红黑树的定义红黑树是二叉排序树一左子树结点值≤根结点值≤右子树结点值。

señoritaw的博客 1909

语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python)

本文介绍了Python中常用的音频处理库PyAudio,详细解析了其核心功能、核心概念和典型工作流程。PyAudio是一个跨平台的音频I/O库,支持音频录制、播放、实时流处理和低延迟操作。核心概念包括PyAudio类(管理音频设备和流)和Stream类(代表音频流)。文章重点讲解了open()方法的关键参数、回调函数的使用方式以及典型的工作流程,包括设备查询、流配置和资源释放。PyAudio适用于需要实时音频处理的场景,如语音识别和音频效果处理。

算法工程师 706

查找算法--树表查找之二叉排序树

        从前面介绍的查找方法我们知道,折半查找较顺序查找速度快,但折半查找要求表中记录必须有序,因为当在已排序的表中找到新记录恰当的位置时,需要移动许多记录以便为新记录腾出位置。有没有哪一种组织记录的方法使得记录的插入与查找都能够很快地完成呢?本篇博客介绍的树表查找就能解决这个问题。   二叉排序树(BST 也叫二叉查找树)  定义:    二叉排序树或者是一棵空树,或者...

u012256398的专栏 301

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

记录我即将到来的一年 2046

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构之查找

所涉及的主要内容如下图所示: 在基本概念里,静态查找表只有两种操作,一种是查询某个“特定”的数据元素是否在查找表中;另一种是检索某个“特定”的数据元素的各种属性。而在动态查找表中还可以进行插入数据元素和删除数据元素的操作。 在静态查找表知识中,分块查找过程分为两步,首先在索引表中确定待查记录所在块,而后在该块内顺序查找。而索引表是有序排列的! 在动态查找表知识中,要清楚二叉排序树的构造过...

renzhelife 85

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

查找——树表之二叉排序树

这篇文章就介绍一下关于树表的查找方法。我们知道,当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。所以改用动态查找表——几种特殊的树,我们主要介绍二叉排序树与平衡二叉树。

Blusher1的博客 1701

二叉排序树详解

前言博客编写人:Willam 博客编写时间:2017/3/25 博主邮箱:2930526477@qq.com(有志同道合之人,可以加qq交流交流编程心得)1、二叉排序树的介绍二叉排序树又称二叉查找树。二叉排序树有如下性质: 如果它的左子树不为空,那么左子树上的所有结点的值均小于它的根结点的值 如果它的右子树不为空,那么右子树上的左右结点的值均大于它的根结点的值 根结点的左子树和右子树又是二叉排序树。

William 3万+

8.3基于树表的查找

8.3基于树表的查找 基于树的查找法是将待查表组织成特定树的形式并在树结构上实现查找的方法,故又称为树表式查找法,主要包括二叉排序树、平衡二叉树和 B_树等。 一、 二叉排序树 1、 二叉排序树定义与描述 二叉排序树又称为二叉查找树,它是一种特殊的二叉树。 其定义为:二叉树排序树或者是一棵空树,或者是具有如下性质的二叉树: (1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值; (2)若它的右子树非空,则右子树上所有结点的值均大于(或大于等于)根结点的值; (3)它的左右子树也分别为二叉排序树。

WithoutEndFree的博客 906

查找2—树表的查找(二叉排序树;平衡二叉树;B树)

前言: 查找部分的知识就是线性表的查找,树表的查找和散列表的查找。这里我们就来看看树表查找的知识。首先来看一下目录,看看我们本片博客的基本内容: 一、二叉排序树 首先,我们要讲二叉排序树的定义。书上或者其它资料上给出的二叉排序树的定义是递归的。用自己的话来总结就是,首先二叉排序树,根节点的值比左子树小,比右子树大。而且它的子树也满足这个规则(有一个重要的性质就是中序遍历一颗二叉排序树可以得到一个...

充满好奇的threecat 656

树表查找:Python 实现与应用

树表查找通过不同的树结构实现了高效的查找操作,尤其是平衡二叉树和红黑树在保证查找性能方面具有显著优势。掌握树表查找的原理和实现方法,对于优化数据处理和算法设计具有重要意义,能够帮助我们在面对复杂数据结构和频繁查找操作时提供高效的解决方案。

2403_89537385的博客 1017

树表查找的实现(二叉排序树)

树表查找的实现(二叉排序树) 一.实验目的 (1)熟悉二叉排序树的性质 (2)掌握二叉排序树建立与查找算法; 二.实验内容 (1)根据序列{17,25,30,33,34,45,47,50,55,90,100,120,130}画出相应的二叉排序树; (2)在二叉树基本操作实现的代码基础上进行修改,实现二叉排序树的添加操作和查找操作 三.基于二叉排序树的查找算法设计(给出详细的算法步骤,不是程序代码) 二叉排序树的添加(add)操作:(private TreeNode add(TreeNode node,E e

zeroxiaoxian的博客 658

查找-树表的查找-二叉排序树

二叉排序树(Binary Sort Tree)又称二叉查找树,它是一种对排序和查找都有用的特殊二叉树。 定义: 二叉排序树或者是空二叉树,或者是具有下列特性的二叉树: 左子树上所有结点的关键字均小于根结点的关键字; 右子树上所有结点的关键字均大于根结点的关键字; 左子树和右子树又各是一课二叉树。

QQ657205470的博客 731
上一篇: 顺序查找
下一篇: bfs与dfs
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值