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

在这里插入图片描述

查找

  • 🎈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);//在左子树插入结点eelseInsert(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);//查找左子树elsereturn 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);elseDeleteBst(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;elseq->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.mzph.cn/news/195435.shtml

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

相关文章

基于粒子群算法思想的电动汽车充放电策略-V2G模型-程序代码!

电动汽车充放电对电网的安全稳定带来影响&#xff0c;合理规划电动汽车充放电时间和策略是目前的研究热点。本程序仿真了汽车有序充电和无需充电两种案例&#xff0c;利用电动汽车合理消纳新能源电量&#xff0c;利用粒子群算法思想来求解模型&#xff0c;程序中案例丰富&#…

智能锁-SI522TORC522方案资料

南京中科微这款SI522目前完全PinTOPin兼容的NXP&#xff1a;RC522、CV520 复旦微&#xff1a;FM17520、FM17522/FM17550 瑞盟&#xff1a;MS520、MS522 国民技术:NZ3801、NZ3802 SI522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对&quo…

2.1 Linux C 编程

一、Hello World 1、在用户根目录下创建一个C_Program&#xff0c;并在这里面创建3.1文件夹来保存Hellow World程序&#xff1b; 2、安装最新版nvim ①sudo apt-get install ninja-build gettext cmake unzip curl ②sudo apt install lua5.1 ③git clone https://github.…

HarmonyOS 振动效果开发指导

Vibrator 开发概述 振动器模块服务最大化开放硬工最新马达器件能力&#xff0c;通过拓展原生马达服务实现振动与交互融合设计&#xff0c;打造细腻精致的一体化振动体验和差异化体验&#xff0c;提升用户交互效率和易用性、提升用户体验、增强品牌竞争力。 运作机制 Vibrato…

内衣专用洗衣机怎么样?好用又便宜的迷你洗衣机推荐

迷你洗衣机作为一种小型便捷的家用必备洗涤设备&#xff0c;一直都受到越来越多家庭的青睐。一台迷你洗衣机可以帮助我们解决很多麻烦&#xff0c;节省我们的很多时间。对于不少在外工作的人&#xff0c;往往是一个人住&#xff0c;买一台大型的洗衣机或许有点浪费资源&#xf…

JWT令牌的获取与过滤器Filter的使用

JWT&#xff0c;全称JSON Web Token&#xff08;JSON Web令牌&#xff09;&#xff0c;是一个开放标准 (rfc7519)。它定义了一种紧凑的、自包含的方式&#xff0c;以JSON对象的形式安全地在各方之间传输信息。这种信息可以被验证和信任&#xff0c;因为它是通过数字签名实现的。…

专升本期间部分C语言程序整理

说明 这些程序是我在专升本期间在CSDN上上传的作业、练习等&#xff0c;仅为学习备考的一小部分程序&#xff0c;整理成一篇文章&#xff0c;方便专升本的学弟学妹参考。 时间&#xff1a;2021年~2022年专升本期间 字符串题 输入字符串提取 数字字符 并 求和 &#xff08;4处…

WPS论文写作——公式和公式序号格式化

首先新建一个表格&#xff0c;表格尺寸按你的需求来确定&#xff0c;直接 插入--》表格 即可。 然后在表格对应位置填上公式&#xff08;公式要用公式编辑器&#xff09;和公式序号&#xff0c;然后可以按照单独的单元格或者整行或整列等来设置样式&#xff0c;比如居中对齐、…

电脑监控软件的监控方式有哪些

电脑监控软件是一种用于监视和控制计算机操作的工具&#xff0c;通常用于企业或个人对计算机的使用情况进行监控和管理。本文将探讨电脑监控软件的监控方式及其存在的问题。 首先&#xff0c;电脑监控软件的监控方式主要包括以下几种&#xff1a; 1、屏幕监控&#xff1a;这种…

【23-24 秋学期】NNDL 作业10 BPTT

习题6-1P 推导RNN反向传播算法BPTT. 习题6-2 推导公式(6.40)和公式(6.41)中的梯度&#xff0e; 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时&#xff0c; 分析其可能存在梯度爆炸的原因并给出解决方法&#xff0e; 习题6-2P 设计简单RNN模型&#xff0c;分别…

洛谷P1044 [NOIP2003 普及组] 栈 递归方法

目录 核心&#xff1a; 问题转化&#xff1a; 状态转化&#xff1a;&#xff08;你得先读懂题&#xff0c;理解我们要干什么&#xff09; 对应不同情况下的状态转化&#xff1a;&#xff08;比如栈空就不能出栈&#xff0c;&#xff0c;&#xff09; AC代码&#xff1a; 题…

【每日OJ —— 110. 平衡二叉树】

每日OJ —— 110. 平衡二叉树 1.题目&#xff1a;110. 平衡二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;110. 平衡二叉树 2.解法 2.1.算法讲解 1.这道题中的平衡二叉树的定义是&#xff1a;二叉树的每个节点的左右子树的高度差的绝对值不超过 11…

Android12之MediaCodec硬编解码调试手段(四十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

继续画图带你学习TCP 其他 7 大特性

四、滑动窗口机制 五、流量控制 六、拥塞控制 (安全机制) 七、延迟应答 (效率机制) 八、捎带应答 (效率机制) 九、粘包问题 十、保活机制 TCP总结 四、滑动窗口机制 滑动窗口机制&#xff0c;是在可靠性的前提下&#xff0c;进一步地提高传输效率 认识滑动窗口 一发一收…

vscode的eslint检查代码格式不严谨的快速修复

问题&#xff1a; 原因&#xff1a;复制的代码&#xff0c;esLint检查代码格式不正确。或者写的代码位置不严谨&#xff0c;总是提示 解决 设置在Ctrl S保存时自动格式化代码 1、vscode设置 2、点击右上角&#xff0c;切换json模式 3、添加设置 "editor.codeActionsOn…

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

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

【零基础入门Python】Python If Else流程控制

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门Pythonhttps://blog.csdn.net/arthas777/category_12455877.html Python if语句 Python if语句的流程图 Python if语句示例 Python If-Else Statement Python if else语句的流程图 使用Python if-else语句 …

JVM 运行时内存篇

面试题&#xff1a; 讲一下为什么JVM要分为堆、方法区等&#xff1f;原理是什么&#xff1f;&#xff08;UC、智联&#xff09; JVM的分区了解吗&#xff0c;内存溢出发生在哪个位置 &#xff08;亚信、BOSS&#xff09; 简述各个版本内存区域的变化&#xff1…

木质家具行业分析:我国市场规模总资产达1669.19亿元

木质家具是指以天然木材和木质人造板为主要材料&#xff0c;配以其他辅料(如油漆、贴面材料、玻璃、五金配件等)制作各种家具的生产活动。 近年来实木家具越来越受到广大消费者的青睐。继板式家具、板式定制家具之后&#xff0c;板木家具与整木定制家具渐渐走进人们的视野。但目…

酵母双杂交服务专题(四)

关于酵母双杂交服务的常见问题 问题1&#xff1a;酵母双杂交的筛选流程&#xff1f; 研究者将特定基因作为钓饵&#xff0c;在一个精心挑选的cDNA文库中进行筛选&#xff0c;目的是找到与该钓饵蛋白发生相互作用的蛋白质。通过这种筛选&#xff0c;可以从阳性反应的酵母菌株中…