数据结构与算法-动态查找表

news2025/1/10 3:18:49

在这里插入图片描述

查找

  • 🎈3动态查找表
    • 🔭3.1二叉排序树
      • 🏆3.1.1二叉排序树的类定义
      • 🏆3.1.2二叉排序树的插入和生成
      • 🏆3.1.3二叉树的查找
      • 🏆3.1.4二叉排序树的删除
    • 🔭3.2平衡二叉树
      • 🏆3.2.1平衡二叉树的调整方法
        • 🎠RR型调整
        • 🎠LL型调整
        • 🎠RL型调整
        • 🎠LR型调整
      • 🏆3.2.2平衡二叉树的查找分析

🎈3动态查找表

🔭3.1二叉排序树

🔎二叉排序树,又称二叉查找树,其或者是一棵空树,或者是满足下列性质的二叉树:

  1. 若它的左子树不空,则左子树上所有元素的值均小于根结点元素的值。
  2. 若它的右子树不空,则右子树所有元素的值均大于根结点元素的值。
  3. 左右子树分别为二叉排序树。

上述定义要求查找表中没有相同关键字的数据元素。
📖根据二叉排序树的定义可知,对二叉排序树进行中序遍历可以得到一个有序序列。因此对于任意一个关键字序列构造一棵二叉排序树,其实质是对此关键字序列进行排序,使其变成有序序列。

🏆3.1.1二叉排序树的类定义

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
typedef int KeyType;
typedef int InfoType;
typedef struct
{
	KeyType key;//KeyType为关键字数据类型
	InfoType otherinfo;//其他域
}DElemType;
typedef struct BstNode
{
	DElemType data;
	BstNode* lchild, * rchild;
}BstNode;
class BsTree
{
private:
	BstNode* bst;
	void Insert(BstNode*& t, DElemType e);//二叉排序树中递归插入一个结点
	BstNode* Search(BstNode* t, KeyType key);//递归查找关键字key
public:
	BsTree()//构造函数,创建空的二叉排序树
	{
		bst = NULL;
	}
	BstNode* SearchBST(KeyType key);//查找关键字等于key的结点
	void InsertBST(DElemType e);//递归创建的二叉树传递给私有成员
	void CreatBiTree(DElemType d[], int n);//生成二叉排序树,n个数据在数组d中
	void DeleteBst(BstNode*& t, DElemType e);//删除二叉排序树中的一个结点
	void Deletep(BstNode*& p);/从二叉排序树中删除结点p,并重接它的左子树或右子树
};

🏆3.1.2二叉排序树的插入和生成

📖二叉排序树的插入操作应保证插入后仍满足二叉排序树的定义,新插入的结点总是叶子结点。其插入过程如下:

  1. 若二叉树t为空,则生成一个根结点。
  2. 将key于根结点的关键字比较,若keydata,则将key插入到根结点的左子树中,否则插入到根结点的右子树中。
    在这里插入图片描述
void BsTree::Insert(BstNode*& t, DElemType e)
{
	if (t == NULL)
	{
		t = new BstNode;
		t->lchild = t->rchild = NULL;
		t->data = e;
		return;
	}
	if (e.key < t->data.key)
		Insert(t->lchild, e);//在左子树插入结点e
	else
		Insert(t->rchild, e);//在右子树插入结点e
}
void BsTree::InsertBST(DElemType e)
{
	BstNode* t = bst;
	Insert(t, e);
	bst = t;
}
void BsTree::CreatBiTree(DElemType d[], int n)
{
	for (int i = 0; i < n; i++)
	{
		InsertBST(d[i]);
	}
}

🏆3.1.3二叉树的查找

📖由于二叉排序树按中序遍历可得有序序列,所以在二叉排序树中进行查找,与二分查找类似,也是一个逐步缩小查找范围的过程,查找的步骤如下:

  1. 若二叉树t为空,或key==t->data.key,则返回t
  2. 否则将key与根结点的关键字比较,若key<t->datda.key,则递归查找左子树,否则递归查找右子树。
    在这里插入图片描述
BstNode* BsTree::Search(BstNode* t, KeyType key)
{
	if (t == NULL || key == t->data.key)
		return t;
	else if (key < t->data.key)
		return Search(t->lchild, key);//查找左子树
	else
		return Search(t->rchild, key);//查找右子树
}
BstNode* BsTree::SearchBST(KeyType key)
{
	BstNode* t = bst;
	return Search(t, key);
}

🏆3.1.4二叉排序树的删除

二叉排序树中删除结点的原则是:删除结点后仍是二叉排序树。
🔎设在二叉排序树被删除结点是p,其双亲结点是f.不失一般性,设p的左孩子或p为根结点。分三种情况讨论:

  1. 若p为叶子结点,则直接删除。如图a所示。
  2. 若p只有左子树pl或只有右子树pr,则令pl或pr直接成为双亲结点f的子树。如图b或c所示。

在这里插入图片描述

  1. 若被删除结点p既有左子树pl又有右子树pr,则在pl中选值最大的代替p,该数据按二叉排序树的性质应在左子树的最右下结点。
    在这里插入图片描述
void BsTree::DeleteBst(BstNode*& t, DElemType e)
{
	if (!t)
		return;
	else
	{
		if (e.key == t->data.key)
			Deletep(t);
		else if (e.key < t->data.key)
			DeleteBst(t->lchild, e);
		else
			DeleteBst(t->rchild, e);
	}
}
void BsTree::Deletep(BstNode*& p)
{
	if (!p)
		return;
	BstNode* s, * q;
	if (p->rchild == NULL)
	{
		q = p;
		p = p->lchild;
		delete q;
	}
	else if (p->lchild == NULL)
	{
		q = p;
		p = p->rchild;
		delete q;
	}
	else 
	{
		q = p;
		s = p->lchild;
		while (s->rchild != NULL)
		{
			q = s;
			s = s->rchild;
		}
		p->data = s->data;
		if (q != p)
			q->rchild = s->lchild;
		else
			q->lchild = s->rchild;
		delete s;
	}
}

🔭3.2平衡二叉树

🌞平衡二叉树或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:

  1. 它的左右子树均为平衡二叉树。
  2. 左子树和右子树的高度之差的绝对值不超过1

✅若将二叉树上结点的平衡因子定义为该结点的左子树的高度与右子树的高度之差,则平衡二叉树上的所有结点的平衡因子只可能是1,0和-1。若平衡二叉树上有一个结点的平衡因子的绝对值大于1,则该树就不是一棵平衡二叉树。

🏆3.2.1平衡二叉树的调整方法

🌞若向平衡二叉树中插入一个新结点而引起不平衡,则采用以下方法进行调整:

  1. 不涉及到不平衡点的双亲,即以不平衡点为根的子树高度应保持不变。
  2. 新结点插入后,向根结点回溯,找到第一个原平衡因子不为0的结点。
  3. 在调整中,仅涉及前面提到的最小子树。
  4. 调整后二叉树的性质不变。
🎠RR型调整

🔎RR型调整是指在A结点的右孩子(设为B结点)的右子树上插入一个结点,使得A结点的平衡因子由-1变为-2引起不平衡而产生的调整。如图所示,带阴影区域表示插入结点,h表示子树的树高。调整方法为单向左旋转平衡,具体方法如下:

  1. 把结点B变为调整后的最小子树的根结点。
  2. 把结点A变成结点B的左孩子。
  3. BL变成结点A的右子树。

在这里插入图片描述

🎠LL型调整

🔎LL型调整是指在A结点的左孩子(设为B结点)的左子树上插入一个结点,使得A结点的平衡因子由1变为2引起不平衡而产生的调整。如图所示,带阴影区域表示插入结点,h表示子树的树高。调整方法为单向右旋转平衡,具体方法如下:

  1. 把结点B变为调整后的最小子树的根结点。
  2. 把结点A变成结点B的右孩子。
  3. BR变成结点A的左子树。
    在这里插入图片描述
🎠RL型调整

🔎RL型调整是指在A结点的右孩子(设为B结点)的左子树上插入一个结点,使得A结点的平衡因子由-1变为-2引起不平衡而产生的调整。如图所示,带阴影区域表示插入结点,h表示子树的树高。调整方法为右旋转后向左旋转平衡,具体方法如下:

  1. 把结点B的左孩子(设为C)变为调整后的最小子树的根结点。
  2. 把结点A变成结点C的左孩子,结点B变为结点C的右孩子。
  3. 把结点C的右子树变为结点B的左子树。
  4. 把结点C的左子树变为结点A的右子树。
    在这里插入图片描述
🎠LR型调整

🔎LR型调整是指在A结点的左孩子(设为B结点)的右子树上插入一个结点,使得A结点的平衡因子由1变为2引起不平衡而产生的调整。如图所示,带阴影区域表示插入结点,h表示子树的树高。调整方法为左旋转后向右旋转平衡,具体方法如下:

  1. 把结点B的右孩子(设为C)变为调整后的最小子树的根结点。
  2. 把结点A变成结点C的右孩子,结点B变为结点C的左孩子。
  3. 把结点C的右子树变为结点A的左子树。
  4. 把结点C的左子树变为结点B的右子树。
    在这里插入图片描述

🏆3.2.2平衡二叉树的查找分析

由于平衡二叉树关键字的查找过程与二叉排序树关键字的查找过程相同,因此,在平衡二叉树的查找过程中关键字的比较次数不超过平衡二叉树的深度。
在这里插入图片描述

好啦,关于动态查找表二叉排序树和平衡二叉树的知识到这里就先结束啦,后期会继续更新学习数据结构与算法的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

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

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

相关文章

基于jsp的搜索引擎

摘 要 随着互联网的不断发展和日益普及&#xff0c;网上的信息量在迅速地增长&#xff0c;在2004年4月&#xff0c;全球Web页面的数目已经超过40亿&#xff0c;中国的网页数估计也超过了3亿。 目前人们从网上获得信息的主要工具是浏览器&#xff0c;搜索引擎在网络中占有举足轻…

平价的开放式耳机怎么选?推荐几款平价好用的耳机,亲测对比

是不是也在为如何在有限的预算内找到一款性价比高的开放式耳机而烦恼呢&#xff1f;别着急&#xff0c;小编为你精心挑选了几款平价好用的开放式耳机&#xff0c;并亲自进行了对比测试&#xff0c;在这个音乐时代&#xff0c;不需要花大价钱就能拥有高品质的音乐体验&#xff0…

微积分-圆的面积和周长(1)

微积分 历史 先有牛顿后有天&#xff0c;创世之后再造仙。作为近代物理学的开山鼻祖&#xff0c;牛顿的贡献怎么评价都不为过。而微积分是首先被牛顿搞出来的也已经是公认的事实&#xff0c;牛顿在研究物理问题的时候顺带做出来的&#xff0c;不知是舍不得发表还是不屑于发表…

Jmeter的安装配置,性能测试编写

1、jmeter介绍 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 运行环境为Windows 10系统&#xff0c…

电动车刷卡-CI522方案

Ci522是一颗工作在13.56MHz频率下的非接触式读写芯片&#xff0c;支持读A卡&#xff08;CI523支持读A/B卡&#xff09;&#xff0c;可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本&#xff0c;PCB小体积的产品提供了可靠的选择。 Ci522与Si522/MFRC52…

Python函数的基本使用(一)

Python函数的基本使用&#xff08;一&#xff09; 一、函数概述二、函数的定义2.1 函数的语法2.2 语法说明2.3 函数定义的方式2.4 总结 三、函数的调用3.1 函数调用语法3.2 语法说明3.3 函数调用 四、函数的参数4.1 参数的分类4.2 必需参数4.3 默认值参数4.4 关键字参数4.5 不定…

【每日OJ —— 101. 对称二叉树】

每日OJ —— 101. 对称二叉树 1.题目&#xff1a;101. 对称二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;101. 对称二叉树 2.解法 2.1.算法讲解 1.该题是判断二叉树是否对称&#xff0c;关键在于&#xff0c;左子树等于右子树&#xff0c;而所给的…

【Linux | 编程实践】防火墙 (网络无法访问)解决方案 Vim常用快捷键命令

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

前端项目中获取浏览器版本的方法

在我们的前端项目中&#xff0c;navigator.userAgent属性含有当前浏览器相关信息&#xff08;比如版本号&#xff09;。 所以当我们想要获取用户当前访问的浏览器的版本时直接去解析navigator.userAgent字段就中。 废话不多说&#xff0c;下面看封装的获取浏览器版本的函数&am…

git的安装及ssh配置(Linux)

环境 CentOS Linux release 7.9.2009 (Core) Xftp7 安装 方法一&#xff1a;yum安装 yum是一个客户端软件&#xff0c;就好比手机上的应用商店&#xff0c;帮助我们对软件的下载、安装和卸载 1、首先查看自己是否安装过git [rootxiaoxi ~]# git -bash: git: command not fo…

【ArcGIS Pro微课1000例】0046:深度学习--汽车检测

本实验讲述ArcGIS Pro中人工智能深度学习应用之–汽车检测。 文章目录 一、学习效果二、工具介绍三、案例实现四、注意事项一、学习效果 采用深度学习工具,可以很快速精准的识别汽车。 案例一: 案例二: 下面讲解GIS软件实现流程。 二、工具介绍 该案例演示的是ArcGIS Pro中…

基于java技术的电子商务支撑平台

摘 要 随着网络技术的发展&#xff0c;Internet变成了一种处理日常事务的交互式的环境。互联网上开展各种服务已经成为许多企业和部门的急切需求。Web的普遍使用从根本上改变了人们的生活方式、工作方式&#xff0c;也改变了企业的经营方式和服务方式。人们可以足不出户办理各…

网络层之SDN基本概念、路由算法和路由协议

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

免费百度SEO优化工具,百度SEO优化排名工具

百度SEO关键词工具 让我们聚焦在百度SEO关键词工具上。对于任何想要在百度搜索引擎中脱颖而出的网站管理员而言&#xff0c;深入了解用户搜索习惯和关键词的选择是至关重要的。 百度SEO关键词工具不仅提供了免费的服务&#xff0c;而且功能强大。通过输入相关领域的关键词&…

前缀和列题AcWing795

import java.io.*;//前缀和:改题目要求 求一串整数数列中l~r中的数的和 //可以提前算好前n项的和s[n],然后用s[n] - s[n - 1]public class Main {static int n,m,l,r;static int N 100010;static BufferedReader in new BufferedReader(new InputStreamReader(System.in));st…

基于springboot 图书馆管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

Rust UI开发(五):iced中如何进行页面布局(pick_list的使用)?(串口调试助手)

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第五篇&#xff0c;前四篇链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建UI时…

GEE:使用Roberts算子卷积核进行图像卷积操作

作者:CSDN @ _养乐多_ 本文将深入探讨边缘检测中的一个经典算法,即Roberts算子卷积。我们将介绍该算法的基本原理,并演示如何在Google Earth Engine中应用Roberts算子进行图像卷积操作。并以试验区NDVI为例子,研究区真彩色影像、NDVI图像以及卷积结果如下所示, 文章目录 …

debian系统突然启动不成功或进不去图形界面,内存饱满

debian系统突然启动不成功或进不去图形界面,内存饱满 如果登陆不进去&#xff0c;输入密码后一直提示 Xsession :warning:unable to write to /tmp; X session may exit with an error。 可能是硬盘满了。 还有一种可能&#xff0c;连登陆的图形界面都没进去&#xff0c;开机后…

凌恩生物福利第二弹:转发送书!全方位多组学研究解决方案!

研究微生物的组学有很多种&#xff0c;都能在研究中提供研究所需的信息&#xff0c;然而随着科学研究的发展过程&#xff0c;单一的微生物组学研究已很难系统地阐释其生物过程的发生机制与发展变化&#xff0c;微生物与宿主&#xff0c;环境之间的整体性和复杂性&#xff0c;需…