数据结构——7.3 树形查找

7.3 树形查找

概念

  1. 二叉排序树(BST)
    在这里插入图片描述

二叉排序树(Binary Sort Tree,BST),又称为二叉查找(搜索)树(Binary Search Tree),是一种特殊的二叉树,它具有以下性质:

  1. 若它的左子树非空,则左子树上所有结点的值均小于根结点的值。
  2. 若它的右子树非空,则右子树上所有结点的值均大于根结点的值。
  3. 左、右子树本身又各是一棵二叉排序树,即具有递归性。

这些性质使得二叉排序树在进行查找、插入和删除操作时都能保持较高的效率。例如,在查找操作中,从根节点开始,如果待查找的值小于当前节点的值,则在左子树中继续查找;如果待查找的值大于当前节点的值,则在右子树中继续查找。这种查找方式的时间复杂度与树的高度相关,理想情况下可以达到O(log n)的复杂度。

二叉排序树的插入操作也很高效。在插入新元素时,可以从根节点开始,比较新元素与当前节点的值,根据大小关系决定向左子树还是右子树进行插入,直到找到合适的位置。

此外,由于二叉排序树的中序遍历序列是一个递增有序序列,因此它也可以用于对元素进行排序。

需要注意的是,当插入的元素正好是有序的时,二叉排序树可能会退化成链表,导致查找效率降低。因此,在实际应用中,可能需要采取一些措施来避免这种情况的发生,如使用平衡二叉树等数据结构。

  1. 平衡二叉树
    在这里插入图片描述

平衡二叉树(Balanced Binary Tree),又称为AVL树,是一种特殊的二叉搜索树(Binary Search Tree)结构。它对于任意节点,其左子树和右子树的高度之差不超过1,并且左子树和右子树也都是平衡二叉树。平衡二叉树的设计目的是为了解决普通二叉搜索树在插入、删除等操作时产生不平衡的问题,导致树的高度过高,从而影响搜索的效率。

平衡二叉树具有广泛的应用场景,包括:

  1. 查找和排序:平衡二叉树可以用于快速查找和排序数据。由于其特殊的结构,它可以在O(log n)的时间内完成查找和排序操作,这比线性搜索更为高效。
  2. 实现字典:平衡二叉树可以用来实现字典,其中键是树中的节点,值是与该键相关联的数据。在这种情况下,平衡二叉树的节点将按照键的顺序排列,因此查找特定键的值是非常快速的。
  3. 数据库:平衡二叉树可以用于实现数据库中的索引。索引可以帮助加速数据库的查询操作。平衡二叉树可以在不需要扫描整个数据库的情况下快速定位特定的记录。
  4. 线性数据结构的实现:平衡二叉树可以用于实现一些常见的线性数据结构,如栈、队列和优先队列。这是通过在树的一侧添加新节点并在另一侧移除节点来实现的,从而保持平衡性。

此外,平衡二叉树还有一些常用的算法,如红黑树、AVL、Treap等,用于构造和调整平衡二叉树。

总的来说,平衡二叉树通过保持树的平衡性,提高了搜索、插入和删除操作的效率,在各种应用场景中都发挥着重要作用。

  • 调整最小不平衡子树旋转概述:原父为最小不平衡点

      1.  RR:对儿子:左旋L,左孩变原父右2.  LL:对儿子:右旋R,右孩变原父左3.  RL:对孙子:先右旋再左旋RL4.  LR:对孙子:先左旋再右旋LR
    
  1. 红黑树 在这里插入图片描述

红黑树(Red Black Tree)是一种自平衡的二叉查找树,在计算机科学中常用作一种数据结构,其典型的用途是实现关联数组。红黑树是平衡二叉查找树的变体,它在保持平衡的同时,允许其左右子树的高度差有可能大于1,但不超过一倍。这种设计使得红黑树在插入和删除节点时能够保持较低的平衡代价,并因此获得较高的查找性能。

红黑树具有五大性质,这些性质保证了其结构的平衡性和搜索效率:

  1. 每个节点要么是黑色,要么是红色。
  2. 根节点是黑色。
  3. 每个叶节点(Nil或空值)都是黑色。
  4. 每个红色节点的两个子节点一定都是黑色(但黑色节点的子节点可以也是黑色)。
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

这些性质确保了红黑树在插入、删除和查找操作中的效率。在最坏情况下,红黑树的运行时间也非常良好,可以在O(log n)时间内完成查找、插入和删除操作,其中n是树中元素的数目。

与平衡二叉树(AVL树)相比,红黑树在追求平衡的策略上有所不同。红黑树放弃了追求完全平衡,转而追求大致平衡。这使得红黑树在插入新节点时,最多只需要三次旋转就能达到平衡,实现起来更为简单。而平衡二叉树追求绝对平衡,每次插入新节点后可能需要多次旋转,旋转的次数不能预知。

总的来说,红黑树是一种高效且实用的数据结构,能够在保持平衡的同时提供快速的查找、插入和删除操作。

红黑树的查找:与二叉树BST、AVL相同,从根出发,左小右大,若查找到一个叶结点,则查找失败

理解

  1. 二叉排序树操作复杂度主要与树的高度有关,如果是平衡二叉排序树,则复杂度是O(log₂n),如果是只有单侧树,即n个结点排成一条线,复杂度是O(n)

  2. 二叉排序树的数据结构

名称左指针权值右指针
作用指向比自己小的结点结点的值指向比自己大的结点
  1. 平衡二叉树结点最少的情况

    1. 左右子树相差一个结点,可以递归

    2. 高度为0,最少0个结点;高度为1,最少1个结点

    3. 高度为h,最少结点数n_(h)=n_(h-1)+n_(h-2)+1

    4. 平衡二叉树结点最少的情况下,每个非叶结点的平衡因子都是1

  2. 对于任意一棵非空二叉排序树T1,如果删除某个结点v之后形成二叉排序树T2,再将v结点插入T2形成二叉排序树T3则有

    1. 若v是T1的叶结点,则T1与T3相同

    2. 若v不是T1叶结点,则T1和T3不同

  3. 对于任意一棵非空平衡二叉树T1,如果删除某个结点v之后形成平衡二叉树T2,再将v结点插入T2形成平衡二叉树T3则有

    1. 若v是T1的叶结点,则T1与T3未必相同

    2. 若v不是T1叶结点,则T1和T3未必相同

技巧

  1. 二叉排序树查找序列的规律:以2,252,401,398,330,…为例
次数比较说明序列规律
12访问根结点2
2252,252>2访问左子树2522后是结点2的左子树,后面的值都应该>2
3401,401>252访问左子树401252后是结点252的左子树,后面的值都应该>252
4398,398<401访问右子树398401后是结点401的右子树,后面的值都应该<401
…………

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

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

相关文章

力扣---从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]示…

使用Docker搭建Redis主从集群

文章目录 ☃️前言☃️搭建❄️❄️架构❄️❄️实例说明❄️❄️搭建第一个服务器上的两个实例❄️❄️搭建第二个服务器上的一个实例 ☃️开启主从❄️❄️改配置❄️❄️重启从节点 ☃️验证 ☃️前言 单节点 Redis 的并发能力是有上限的&#xff0c;要进一步提高Redis的并…

[大模型]TransNormerLLM-7B FastApi 部署调用

TransNormerLLM-7B FastApi 部署调用 1. TransNormer 介绍 TransNormerLLM 是一个基于线性注意力的 LLM&#xff0c;在准确性和效率方面均优于传统的基于 softmax 注意力的模型。它是在包含多达1.4 万亿个令牌的高质量语料库上进行训练的&#xff0c;TransNormerLLM 从之前的…

K-means和DBSCAN

目录 一、K-means和DBSCAN之间的主要区别 二、DBSCAN聚类算法 2.1DBSCAN聚类算法实现点集数据的聚类 2.2DBSCAN聚类算法实现鸢尾花数据集的聚类 三、K-means聚类算法 3.1K-means聚类算法实现随机数据的聚类 3.2K-means聚类算法实现鸢尾花数据集的聚类 一、K-means和DBSC…

014Node.js时间格式包silly-datetime安装与使用

下载&#xff1a; https://www.npmjs.com/网站上下载silly-datetime 安装 npm i silly-datetime --save var sd require(silly-datetime);console.log(new Date()); //2024-04-18T04:40:38.505Zvar dsd.format(new Date(), YYYY-MM-DD HH:mm);console.log(d); //2024…

idea在controller或者service使用ctrl+alt+b进入方法后,如何返回到 进入前的那一层

idea在controller或者service使用ctrlaltb进入方法后&#xff0c;如何返回到进入方法的最外层 解决方案使用 ctrlalt ← /→← /→ 键盘上的左右键盘

stm32中断发送接收数据

配置hal库 1配置时钟 2配置uart 3打开中断 程序结构 uart中断函数 中断接收和发送函数 HAL_UART_Receive_IT()&#xff1a;启动中断驱动的接收过程&#xff0c;当接收到指定数量的字节后会产生中断&#xff0c;并调用HAL_UART_RxCpltCallback()回调函数。 HAL_StatusTypeD…

STL分解

效果图 ref&#xff1a;时序数据分析的利器——STL分解 - 知乎 (zhihu.com)

2024化工制造企业数字化白皮书

来源&#xff1a;蓝凌研究院 中国石油和化学工业联合会发布2023年中国石油和化工行业经济运行情况。数据显示&#xff0c;2023年&#xff0c;我国石化行业实现营业收入15.95万亿元&#xff0c; 同比下降1.1%&#xff0c;利润总额8733.6亿元&#xff0c;行业经济运行总体呈现低…

MySQL-笔记-06.数据高级查询

目录 6.1 连接查询 6.1.1 交叉连接&#xff08;cross join&#xff09; 6.1.2 内连接&#xff08;inner join&#xff09; 6.1.3 外连接&#xff08;outer join&#xff09; 6.1.3.1 左外连接&#xff08;left [outer] join&#xff09; 6.1.3.2 右外连接&#xff08;rig…

VSCode 目录折叠展开、缩进深度设置

1、VSCode 目录折叠展开设置 运行 Visual Studio Code &#xff0c;按 Ctrl &#xff0c;打开设置 输入Explorer:Compact Folders&#xff0c;取消勾选 或者在设置文件上添加 "explorer.compactFolders": false2、VSCode 目录缩进深度设置 输入Workbench Tree:…

【C# 数据结构-队列】

在C#中&#xff0c;队列&#xff08;Queue&#xff09;是一种先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的数据结构&#xff0c;允许添加&#xff08;Enqueue&#xff09;和移除&#xff08;Dequeue&#xff09;元素。队列类在.NET Framework的Syste…

Navicat Premium 16最新版激活 mac/win

Navicat Premium 16 for Mac是一款专业的多连接数据库管理工具。它支持连接多种类型的数据库&#xff0c;包括MySQL、MongoDB、Oracle、SQLite、SQL Server、PostgreSQL等&#xff0c;可以同时连接多种数据库&#xff0c;帮助用户轻松地管理和迁移数据。 Navicat Premium 16 fo…

1.PROXY-代理内容

SwitchyOmega&#xff0c;浏览器插件&#xff08;edge&#xff0c;火狐插件库都是存在的&#xff09;&#xff0c;安装后的样式 1.安装 2.设置 我们常用的功能&#xff0c;主要是设置一个代理ip访问学习网站入github等&#xff0c;或者docker服务等 3.启动代理 4.验证 https…

LLMs之Llama3:Llama 3的简介、安装和使用方法、案例应用之详细攻略

LLMs之Llama3&#xff1a;Llama 3的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年4月18日&#xff0c;Meta 重磅推出了Meta Llama 3&#xff0c;本文章主要介绍了Meta推出的新的开源大语言模型Meta Llama 3。模型架构 Llama 3 是一种自回归语言模型&#x…

移动端双验证码登录实现

说明&#xff1a;本文介绍如何用图形验证码短信验证码实现移动端登录思路&#xff1b; 分析 通过手机号图形验证码手机验证码实现登录的时序图如下&#xff1a; 说明&#xff1a; &#xff08;1&#xff09;用户进入登录界面&#xff0c;出现图形验证码&#xff0c;可点击图形…

python多线程技术(Threading)

文章目录 前言一、多线程(Threading)是什么?二、threading库1.初识多线程2.增加新线程2.1 多线程的基本使用2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)2.3 thread.join()功能2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那…

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

SpringBoot多数据源(一)

SpringBoot多数据源&#xff08;一&#xff09; 1.多数据源使用场景1.1 业务复杂&#xff08;数据量大&#xff09;1.2 读写分离 2.多数据源配置3.应用4.测试 1.多数据源使用场景 1.1 业务复杂&#xff08;数据量大&#xff09; 简单理解就是业务量复杂&#xff0c;将庞大的数…

本地消息表模式保障分布式系统最终一致性

系统架构说明 状态转换说明 订单表消息表process_queue库存系统return_queue说明成功失败///订单库回滚成功成功失败//订单系统重发消息成功成功成功失败/Broker自动重试&#xff0c;注意接口幂等成功成功成功库存不足退回/Broker通知回掉&#xff0c;订单/消息作废成功成功成…