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

在这里插入图片描述

查找

  • 🎈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.rhkb.cn/news/209467.html

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

相关文章

YOLOv8 区域计数 | 入侵检测 | 人员闯入

大家好,昨天的 YOLOv8 新增加了一个功能,区域计数,用这个功能我们能实现很多的任务, 比如入侵检测,流量统计,人员闯入等,使用方式也非常的方便,但是一定要使用最新版的 YOLOv8 代码(2023/12/03更新的代码)。 低版本是不具备这个功能的,上面是演示效果。 使用非常的方…

分享74个节日PPT,总有一款适合您

分享74个节日PPT&#xff0c;总有一款适合您 74个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/18YHKkyJsplx-Gjj7ofpFrg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

如何赚钱?聊聊程序员的副业与生意

说到副业和赚钱一直都是大家非常关心的话题&#xff0c;特别是在今年大环境不好&#xff0c;各大公司频繁裁员的行情之下。单一的收入结构会导致家庭抗风险能力特别差。最近特别火的【中产陷阱话题】说的就是这个道理。 所以&#xff0c;获得除目前工资之外的其他收入&#xf…

C++ string类(1)—初始化、容量操作、迭代器

目录 前言 一、string类 二、初始化 1、无参或带参 2、用字符串变量初始化 3、用字符串初始化 4、指定数量字符 三、容量操作 1、size 2、push_back 3、append​编辑 4、运算符 5、reserve 6、resize 四、迭代器 1、正向迭代器 2、反向迭代器 3、const迭代器…

c++面试题

1.static的使用 1&#xff09;修饰局部变量&#xff1a;在函数内部使用static修饰局部变量&#xff0c;会使它成为静态局部变量。静态局部变量只会被初始化一次&#xff0c;且只有在第一次调用该函数时才会被初始化&#xff0c;之后每次调用该函数时都会保留上一次的值.从原来…

quickapp_快应用_父子组件传值

目录 页面级组件自定义组件(子组件)引入自定义组件(子组件)父组件给子组件传值子组件给父组件进行传值父组件调用子组件的方法 页面级组件 在pages中定义的组件被称为页面级组件。 页面级组件(等同于Vue页面)&#xff0c;通过路由配置可以进行页面跳转。 自定义组件(子组件)…

ESP32-Web-Server编程-简单的照片浏览器

ESP32-Web-Server编程-简单的照片浏览器 概述 从本节开始我们开始制作一些有趣的多媒体 Web 的示例。 当你希望在网页上展示一些广告、照片&#xff0c;或者你的开发板带摄像头&#xff0c;能够采集一些图片&#xff0c;这时你希望可以通过手头的浏览器查看图片&#xff0c;…

Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)

目录 Node.js 文件系统模块&#xff08;二&#xff09; Node.js 文件系统模块&#xff08;三&#xff09; Node.js 文件系统模块&#xff08;四&#xff09; Node.js 路径模块 Node.js 连接 MySQL Node.js nodemon Node.js 操作 MySQL Node.js 应用 Node.js 文件系统模块…

Python----练习:使用面向对象实现报名系统开发

第一步&#xff1a;分析哪些动作是由哪些实体发出的 学生提出报名 学生提供相关资料 学生缴费 机构收费 教师分配教室 班级增加学生信息 于是&#xff0c;在整个过程中&#xff0c;一共有四个实体&#xff1a;学生、机构、教师、班级&#xff01;在现实中的一个具体的实…

如何进行卷积特征可视化

大家好啊&#xff0c;我是董董灿。 之前写过很多关于卷积算法的文章&#xff1a;5分钟理解什么是卷积的特征提取。总的来说&#xff0c;卷积算法的本质是一个特征提取器。 那么既然卷积神经网络在图像分类、图像检测、图像分割以及其他领域有这么好的表现&#xff0c;卷积到底…

Java 不要在父类的构造方法里面调用可以被子类重写的方法

不要在父类的构造方法(代码块)里面调用可以被子类重写的方法 我们从第一天学习Java开始&#xff0c;就对Java的类初始化顺序牢记于心。但是在实际开发过程中&#xff0c;似乎很难能接触这一部分的应用。在这之前&#xff0c;我也认为它只是面试中八股文而已&#xff0c;直到最…

聊一聊大模型 | 京东云技术团队

事情还得从ChatGPT说起。 2022年12月OpenAI发布了自然语言生成模型ChatGPT&#xff0c;一个可以基于用户输入文本自动生成回答的人工智能体。它有着赶超人类的自然对话程度以及逆天的学识。一时间引爆了整个人工智能界&#xff0c;各大巨头也纷纷跟进发布了自家的大模型&#…

Python 潮流周刊#29:Rust 会比 Python 慢?!

△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯。 &#x1f43…

算法基础--双指针

前面已经写了两篇关于算法方面的文章&#xff0c;这几天想了下&#xff0c;决定把这个算法整理成一个系列&#xff0c;除了是帮助自己巩固算法知识外&#xff0c;还能够把自己总结的每种算法的套路保存下来并分享给大家&#xff0c;这样以后即使是哪天想要重拾起来&#xff0c;…

简单可行的SeruatV4的安装方案

目前Seurat的版本从V4升级到了V5&#xff0c;由于一些变化&#xff0c;导致当年取巧&#xff0c;使用获取数据的方法都无法在V5中使用。 建议在操作前重启下Rstudio&#xff08;或更确切的说是R&#xff09;&#xff01;&#xff01;&#xff01; 那么如何确保自己能够安装V4的…

【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标☆

【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标 &#xff08;1&#xff09;前缀和后缀&#xff08;2&#xff09;前缀表&#xff08;最长相同的前缀和后缀的长度&#xff09;&#xff08;3&#xff09;匹配过程示意&#xff08;4&#xff09;next数组的…

matlab 点云放缩变换

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。爬虫网站自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 缩放可以独立应用于三个坐标轴,如将点 ( x , y , z ) ( x

[LeetCode周赛复盘] 第 374 场周赛20231203

[LeetCode周赛复盘] 第 374 场周赛20231203 一、本周周赛总结100144. 找出峰值1. 题目描述2. 思路分析3. 代码实现 100153. 需要添加的硬币的最小数量1. 题目描述2. 思路分析3. 代码实现 100145. 统计完全子字符串1. 题目描述2. 思路分析3. 代码实现 100146. 统计感冒序列的数…

使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

C语言扫雷游戏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、扫雷游戏的分析和设计1.1扫雷游戏的功能说明1.2数据结构的分析1.3文件结构设计 二、扫雷游戏的代码实现总结 前言 详细介绍扫雷游戏的思路和实现过程。 一…