数据结构——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,一经查实,立即删除!

相关文章

FreeLearning C/C++ 译文集翻译完成

C 高级编程C 高级编程秘籍Qt Creator 应用开发C 游戏编程入门指南C 编程入门指南Boost.Asio C 网络编程Boost C 应用开发秘籍第二版C 数据结构与算法设计原理C Qt5 GUI 编程C 高性能编程C 反应式编程C 系统编程秘籍C 研讨会C 现代嵌入式编程秘籍C 专家编程&#xff1a;成为熟练…

Android,判断是否快速点击

问题背景 在Android控件中,如果快速点击容易造成一些不同的bug,尤其是那种在click事件中方有耗时操作的代码,容易引起anr,并且有些性能低的机器,在用户点击多次控件的时候很容易出现问题,在车机中也会导致回弹的一系列问题(这里面包括get到的信号导致回弹),针对于这种…

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

给定两个整数数组 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]示…

Rust常用特型之Borrow和BorrowMut特型

在Rust标准库中&#xff0c;存在很多常用的工具类特型&#xff0c;它们能帮助我们写出更具有Rust风格的代码。 std::borrow::Borrow和AsRef有点相似&#xff0c;如果一个类型实现了Borrow<T>&#xff0c;那么你可以从它的borrow函数里高效的借出一个&T。但是Borrow施…

synchronized和ReentrantLock傻傻分不清楚

synchronized和ReentrantLock都是用于线程间同步的机制&#xff0c;都是可重入锁&#xff08;同一个线程可以多次获取同一个锁&#xff09;&#xff0c;它们的异同点如下&#xff1a; 一、应用场景 1.synchronized可应用于实例方法、静态方法和代码块。 2.ReentrantLock 是 jav…

使用Docker搭建Redis主从集群

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

了解监控易(33):工单管理

在复杂的IT运维环境中&#xff0c;高效、规范地处理各种事务请求至关重要。监控易的工单管理功能&#xff0c;作为一款轻量化的运维协同工具&#xff0c;为团队提供了一个集中化、标准化的平台&#xff0c;以创建、接单、转交、挂起和重启工单&#xff0c;从而确保客户设备故障…

搜维尔科技:SenseGlove 的 Nova 被用于组装卫星接收器的虚拟现实培训项目中

SenseGlove 的 Nova 被用于组装卫星接收器的虚拟现实培训项目中 搜维尔科技&#xff1a;SenseGlove 的 Nova 被用于组装卫星接收器的虚拟现实培训项目中 得益于 SenseGlove 的力反馈专利&#xff0c;学员可以感受到他们正在组装的零件的形状、尺寸和密度。学员可以通过运动跟踪…

[大模型]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…

未加权的相位解包裹算法DCT-0基础入门(含matlab代码和详细教程解析)

后面会更新c++ 的代码 ! phi = phase_unwrap(psi, weight) % get the wrapped differences of the wrapped valuesdx = [zeros([size(psi,1),1]), wrapToPi(diff(psi, 1, 2)), zeros([size(psi,1),1])];dy = [zeros([1,size(psi,2)]); wrapToPi(diff(psi, 1, 1)); zeros([1,s…

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

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

jQuery 选择器有几种,分别是什么

jQuery选择器是用于“选择”&#xff08;或查找&#xff09;HTML元素的强大工具。jQuery选择器基于元素的名称、ID、类、类型、属性等进行选择。以下是jQuery选择器的几种主要类型&#xff0c;以及它们的详细代码示例&#xff1a; 基本选择器&#xff1a; 元素选择器&#xff1…

2024.4.20力扣每日一题——组合总和

2024.4.20 题目来源我的题解方法一 回溯 题目来源 力扣每日一题&#xff1b;题序&#xff1a;39 我的题解 方法一 回溯 以每一个位置开始深搜&#xff0c;直到target等于0或者小于0或者遍历完结束。 关键在于&#xff1a;注意去重 巧妙方法&#xff1a;传入一个index&#x…

stm32中断发送接收数据

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

Qt : 如何解决重载引起的歧义

一、引子 在Qt中编写代码&#xff0c;进行信号和槽函数的连接时&#xff0c;如果采用新的语法&#xff0c;如&#xff1a; connect(ui->doubleSpinBox, &QDoubleSpinBox::valueChanged,this,&App::minValueChanged);当你准备快乐编译时&#xff0c;突然被背刺。卧槽…

【Redis(6)】Redis集群模式配置示例

Redis的三种高可用方案对比参考上一篇博客&#xff1a;深入理解Redis三种高可用方案&#xff0c;以做出明智的选择&#xff0c;下面要探讨的是三种方案其中的一种。 在构建高性能缓存系统时&#xff0c;Redis以其卓越的速度和灵活性成为首选。然而&#xff0c;传统的哨兵模式和…

STL分解

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

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

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