4. 树(二叉树、二叉查找树/二叉排序树/二叉搜索树、平衡二叉树、平衡二叉B树/红黑树)

    • 1. 二叉树
      • 1.1 概述
      • 1.2 特点
      • 1.3 二叉树遍历方式
        • 1.3.1 前序遍历(先序遍历)
        • 1.3.2 中序遍历
        • 1.3.3 后序遍历
        • 1.3.4 层序遍历
    • 2. 二叉查找树(二叉排序树、二叉搜索树)
      • 2.1 概述
      • 2.2 特点
    • 3. 平衡二叉树
      • 3.1 概述
      • 3.2 特点
      • 3.3 旋转
        • 3.3.1 左旋
        • 3.3.2 右旋
      • 3.4 平衡二叉树旋转的四种情况
        • 3.4.1 左左
        • 3.4.2 左右
        • 3.4.3 右右
        • 3.4.4 右左
    • 4. 红黑树(平衡二叉B树)
      • 4.1 概述
      • 4.2 特点
      • 4.3 规则
      • 4.4 添加节点

本文章里的部分照片来源于网络,特此声明,侵权联系删除!

								二叉树|| (由于二叉树存入的数据是无规则的)|二叉查找树(二叉排序树、二叉搜索树)  ||	(由于二叉做查找树的两条子树的高度可能相差太大)|平衡二叉树	||	(由于平衡二叉树添加数据可能需要旋转,浪费时间)|红黑树(平衡二叉B树)			    

1. 二叉树

1.1 概述

二叉树是一种常见的树状数据结构,由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。

  • 二叉树中,任意一个节点的度要小于等于2

  • 左子节点的值小于或等于当前节点的值

  • 右子节点的值大于当前节点的值。

  • 二叉树可以为空树,也可以只有一个根节点。

节点内部结构:

在这里插入图片描述

二叉树结构图:

在这里插入图片描述

1.2 特点

二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点。

具有以下特点:

  1. 根节点:树的顶部节点,没有父节点。

  2. 叶子节点:没有子节点的节点。

  3. 左子节点和右子节点:一个节点只能有最多两个子节点,其中一个是左子节点,另一个是右子节点。

  4. 子树:每个节点都可以作为根节点,形成一颗子树。

  5. 深度:树中节点的最大层次数。

  6. 高度:树中节点的最大深度。

1.3 二叉树遍历方式

1.3.1 前序遍历(先序遍历)

前序遍历(先序遍历): 从根节点开始,然后按照当前节点,左子结点,右子节点的顺序遍历

前序遍历是二叉树遍历的一种方式,也被称为先序遍历。在前序遍历中,先访问根节点,然后按照先左后右的顺序继续遍历左子树和右子树。

前序遍历的步骤

  1. 访问当前节点。

  2. 递归地前序遍历左子树。

  3. 递归地前序遍历右子树。

举个例子,考虑如下的二叉树:

     A/   \B     C/ \   / \
D   E F   G

通过前序遍历,节点的访问顺序将会是:A - B - D - E - C - F - G。具体操作如下:

  1. 访问节点 A。
  2. 递归前序遍历左子树,访问节点 B。
  3. 递归前序遍历左子树,访问节点 D。
  4. 左子树为空,返回到节点 B。
  5. 递归前序遍历右子树,访问节点 E。
  6. 右子树为空,返回到节点 B。
  7. 返回到节点 A。
  8. 递归前序遍历右子树,访问节点 C。
  9. 递归前序遍历左子树,访问节点 F。
  10. 左子树为空,返回到节点 C。
  11. 递归前序遍历右子树,访问节点 G。
  12. 右子树为空,返回到节点 C。

前序遍历的结果是:A - B - D - E - C - F - G。

1.3.2 中序遍历

中序遍历:从最左边的子节点开始,然后按照左子结点,当前节点,右子节点的顺序遍历

中序遍历是二叉树遍历的一种方式。在中序遍历中,先访问左子树,然后访问根节点,最后访问右子树。

中序遍历的步骤

  1. 递归地中序遍历左子树。

  2. 访问当前节点。

  3. 递归地中序遍历右子树。

举个例子,考虑如下的二叉树:

     A/   \B     C/ \   / \
D   E F   G

通过中序遍历,节点的访问顺序将会是:D - B - E - A - F - C - G。具体操作如下:

  1. 递归中序遍历左子树,访问节点 D。
  2. 左子树为空,返回到节点 B。
  3. 中序遍历访问节点 B。
  4. 递归中序遍历左子树,访问节点 E。
  5. 左子树为空,返回到节点 B。
  6. 返回到节点 A。
  7. 递归中序遍历右子树,访问节点 F。
  8. 中序遍历访问节点 C。
  9. 递归中序遍历左子树,访问节点 G。
  10. 左子树为空,返回到节点 C。

中序遍历的结果是:D - B - E - A - F - C - G。

1.3.3 后序遍历

后序遍历:从最左边的子节点开始,然后按照左子结点,右子节点,当前节点的顺序遍历

后序遍历是二叉树遍历的一种方式。在后序遍历中,先访问左子树,然后访问右子树,最后访问根节点。

后序遍历的步骤

  1. 递归地后序遍历左子树。

  2. 递归地后序遍历右子树。

  3. 访问当前节点。

举个例子,考虑如下的二叉树:

     A/   \B     C/ \   / \
D   E F   G

通过后序遍历,节点的访问顺序将会是:D - E - B - F - G - C - A。具体操作如下:

  1. 递归后序遍历左子树,访问节点 D。
  2. 左子树为空,返回到节点 B。
  3. 递归后序遍历右子树,访问节点 E。
  4. 右子树为空,返回到节点 B。
  5. 后序遍历访问节点 B。
  6. 递归后序遍历左子树,访问节点 F。
  7. 左子树为空,返回到节点 C。
  8. 递归后序遍历右子树,访问节点 G。
  9. 右子树为空,返回到节点 C。
  10. 后序遍历访问节点 C。
  11. 返回到节点 A。
  12. 后序遍历访问节点 A。

后序遍历的结果是:D - E - B - F - G - C - A。

1.3.4 层序遍历

层序遍历:从根节点开始一层一层的遍历。

层序遍历是二叉树遍历的一种方式。在层序遍历中,按照从上到下、从左到右的顺序逐层访问节点。

层序遍历的步骤

  1. 将根节点入队。

  2. 循环执行以下操作直到队列为空:

    • 出队一个节点,访问该节点。

    • 如果该节点有左子节点,则将左子节点入队。

    • 如果该节点有右子节点,则将右子节点入队。

举个例子,考虑如下的二叉树:

     A/   \B     C/ \   / \
D   E F   G

通过层序遍历,节点的访问顺序将会是:A - B - C - D - E - F - G。具体操作如下:

  1. 将根节点 A 入队。
  2. 出队节点 A,并访问节点 A。
  3. 将左子节点 B 入队。
  4. 将右子节点 C 入队。
  5. 出队节点 B,并访问节点 B。
  6. 将左子节点 D 入队。
  7. 将右子节点 E 入队。
  8. 出队节点 C,并访问节点 C。
  9. 将左子节点 F 入队。
  10. 将右子节点 G 入队。
  11. 出队节点 D,并访问节点 D。
  12. 出队节点 E,并访问节点 E。
  13. 出队节点 F,并访问节点 F。
  14. 出队节点 G,并访问节点 G。

层序遍历的结果是:A - B - C - D - E - F - G。

2. 二叉查找树(二叉排序树、二叉搜索树)

2.1 概述

二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树结构,在这种树中,每个节点的值都大于其左子树中的任何节点的值,且小于其右子树中的任何节点的值。这使得二叉查找树具有高效的搜索和插入操作。

  • 二叉查找树,又称二叉排序树或者二叉搜索树

2.2 特点

  • 二叉查找树的特点

    • 每一个节点上最多有两个子节点

    • 左子树上所有节点的值都小于根节点的值

    • 右子树上所有节点的值都大于根节点的值

    • 没有重复的节点值。

  • 二叉查找树结构图

    在这里插入图片描述

  • 二叉查找树和二叉树对比结构图

    在这里插入图片描述

  • 二叉查找树添加节点规则

    • 小的存左边

    • 大的存右边

    • 一样的不存

    在这里插入图片描述

3. 平衡二叉树

3.1 概述

平衡二叉树(Balanced Binary Tree),也称为 AVL 树(平衡二叉搜索树),是一种特殊的二叉查找树,它的特点是每个节点的左子树和右子树的高度差不超过1。

平衡二叉树的设计目的是为了保持二叉树的平衡性,以提高查找、插入和删除操作的效率。普通的二叉查找树在某些情况下可能会退化为链表,导致操作的时间复杂度从平均情况下的 O(logn) 变成最坏情况下的 O(n),而平衡二叉树的高度始终保持在 logn 的范围内,保证了操作的高效性。

在平衡二叉树中,每个节点都有一个平衡因子(balance factor),定义为左子树的高度减去右子树的高度。平衡因子可以使平衡二叉树保持平衡。当插入或删除一个节点时,可能会破坏平衡,此时需要通过旋转操作来调整树的结构,使其重新满足平衡性的要求。

3.2 特点

  • 平衡二叉树的特点

    • 二叉树左右两个子树的高度差不超过1

    • 任意节点的左右两个子树都是一颗平衡二叉树

3.3 旋转

  • 旋转触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树
3.3.1 左旋
  • 就是将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

    在这里插入图片描述
    在这里插入图片描述

3.3.2 右旋
  • 就是将根节点的左侧往右拉,左子节点变成了新的父节点,并把多余的右子节点出让,给已经降级根节点当左子节点

    在这里插入图片描述
    在这里插入图片描述

3.4 平衡二叉树旋转的四种情况

3.4.1 左左
  • 左左: 当根节点左子树的左子树有节点插入,导致二叉树不平衡

    • 如何旋转: 直接对整体进行右旋即可

    在这里插入图片描述

3.4.2 左右
  • 左右: 当根节点左子树的右子树有节点插入,导致二叉树不平衡

    • 如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋

      在这里插入图片描述

3.4.3 右右
  • 右右: 当根节点右子树的右子树有节点插入,导致二叉树不平衡

    • 如何旋转: 直接对整体进行左旋即可
      在这里插入图片描述
3.4.4 右左
  • 右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡

    • 如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋

      在这里插入图片描述

  • 平衡二叉树和二叉查找树对比结构图
    在这里插入图片描述

4. 红黑树(平衡二叉B树)

4.1 概述

红黑树(Red-Black Tree)是一种自平衡的二叉查找树,它在进行插入和删除等操作时能够自动调整树的结构,以保持树的平衡性。红黑树的设计目的是在维持平衡的同时提供较高的插入、删除和查找效率。

红黑树的名称来源于每个节点上的一个额外的属性,即节点的颜色,可以是红色或黑色。

红黑树的插入和删除操作都会涉及到节点的颜色变化和旋转操作,通过这些操作来保持树的平衡性。相较于其他平衡二叉树如 AVL 树,红黑树的实现相对简单,并且对于插入和删除操作的限制较少,因此在实际应用中更为常见。

节点内部结构:
在这里插入图片描述

4.2 特点

  • 红黑树的特点

    • 平衡二叉B树

    • 每一个节点可以是红或者黑

    • 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的

4.3 规则

  • 红黑树的红黑规则:

    1. 每一个节点或是红色的,或者是黑色的

    2. 根节点必须是黑色

    3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的

    4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)

    5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

      在这里插入图片描述

  • 红黑树添加节点的默认颜色

    • 添加节点时,默认为红色,效率高

      在这里插入图片描述

4.4 添加节点

  • 红黑树添加节点后保持红黑规则方法:

    • 根节点位置
      • 直接变为黑色
    • 非根节点位置
      • 父节点为黑色
        • 不需要任何操作,默认红色即可
      • 父节点为红色
        • 叔叔节点为红色
          1. 将"父节点"设为黑色,将"叔叔节点"设为黑色

          2. 将"祖父节点"设为红色

          3. 如果"祖父节点"为根节点,则将根节点再次变成黑色

        • 叔叔节点为黑色
          1. 将"父节点"设为黑色

          2. 将"祖父节点"设为红色

          3. 以"祖父节点"为支点进行旋转

在这里插入图片描述

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

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

相关文章

云原生数据库 GaiaDB 的核心技术演进和解析

导读 在越来越强调云原生的环境下,存算分离作为一种新的架构理念,已经是大势所趋。新的技术架构带来新的问题和挑战,百度智能云的云原生数据库 GaiaDB 采用 Quorum 分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性…

ElementUI Form:Select 选择器

ElementUI安装与使用指南 Select 选择器 点击下载learnelementuispringboot项目源码 效果图 el-select.vue&#xff08;Select选择器&#xff09;页面效果图 项目里el-select.vue代码 <script> export default {name: el_select,data() {return {options: [{value…

PHP之数据类型的基本介绍

让我为大家介绍一下PHP中的数据类型吧&#xff01; 数据类型有&#xff1a;字符串、整数、浮点数、布尔、数组、对象、NULL、资源类型 我们可以使用gettype去获取数据类型 var_jump()会返回变量的数据类型与值&#xff0c;一般用于开发调试时使用 字符串 字符串是字符序列…

备战蓝桥杯---搜索(优化1)

显然&#xff0c;我们可以用BFS解决&#xff0c;具体实现与八数码类似&#xff1a; 下面是代码&#xff1a; #include<bits/stdc.h> using namespace std; #define N 3000000 string a,b; int hh,dis[N],cnt; struct node{string u,v; }bian[7]; map<string,int>…

Python爬虫requests库详解

使用 requests 上一节中&#xff0c;我们了解了 urllib 的基本用法&#xff0c;但是其中确实有不方便的地方&#xff0c;比如处理网页验证和 Cookies 时&#xff0c;需要写 Opener 和 Handler 来处理。为了更加方便地实现这些操作&#xff0c;就有了更为强大的库 requests&…

docker 网络模型

一、docker的网络模型分为四种 【1】Host(与宿主机共享一个网络)&#xff0c;宿主机的localhost 及 容器内的localhost 【2】Bridge(与宿主机共享一个局域网&#xff0c;有自己的网络&#xff1b;docker运行默认Bridge)&#xff1b;容器内localhost不是宿主机localhost 【3】…

【CSS + ElementUI】更改 el-carousel 指示器样式且隐藏左右箭头

需求 前三条数据以走马灯形式展现&#xff0c;指示器 hover 时可以切换到对应内容 实现 <template><div v-loading"latestLoading"><div class"upload-first" v-show"latestThreeList.length > 0"><el-carousel ind…

双非本科准备秋招(16.1)—— 力扣二叉树

1、101. 对称二叉树 检查是否对称&#xff0c;其实就是检查左节点等不等于右节点&#xff0c;我们可以用递归来做。 如果左右节点都为null&#xff0c;说明肯定对称呀&#xff0c;返回true。 如果一个为null一个不为null&#xff0c;或者左右的值不相等&#xff0c;则为false。…

flutter开发实战-ijkplayer视频播放器功能

flutter开发实战-ijkplayer视频播放器功能 使用better_player播放器进行播放视频时候&#xff0c;在Android上会出现解码失败的问题&#xff0c;better_player使用的是video_player&#xff0c;video_player很多视频无法解码。最终采用ijkplayer播放器插件&#xff0c;在flutt…

3D力导向树插件-3d-force-graph学习001

一、引入文件&#xff1a;下载静态js文件引入 1、**以vue项目测试&#xff0c;在index.html文件中引入静态文件&#xff08;js文件可在官网下载&#xff09;** 2、**也曾尝试用npm包下载引入的方法&#xff0c;总是会有报错&#xff0c;所以采用静态js文件引入的方式** 二、基…

【高质量精品】2024美赛B题22页word版高质量半成品论文+多版保奖思路+数据+前四问思路代码等(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;获取完整论文&#xff01;&#xff01; B 题整体模型构建 1. 潜水器动力系统失效&#xff1a;模型需要考虑潜水器在无推进力情况下的行为。 2. 失去与主船通信&#xff1a;考虑无法从主船接收指令或发送位置信息的情况。…

【AIGC核心技术剖析】DreamCraft3D一种层次化的3D内容生成方法

DreamCraft3D是一种用于生成高保真、连贯3D对象的层次化3D内容生成方法。它利用2D参考图像引导几何塑造和纹理增强阶段&#xff0c;通过视角相关扩散模型执行得分蒸馏采样&#xff0c;解决了现有方法中存在的一致性问题。使用Bootstrapped Score Distillation来提高纹理&#x…

LabVIEW与EtherCAT实现风洞安全联锁及状态监测

LabVIEW与EtherCAT实现风洞安全联锁及状态监测 在现代风洞试验中&#xff0c;安全联锁与状态监测系统发挥着至关重要的作用&#xff0c;确保了试验过程的安全性与高效性。介绍了一套基于EtherCAT总线技术和LabVIEW软件开发的风洞安全联锁及状态监测系统。该系统通过实时、可靠…

jmeter-04创建请求

文章目录 一、发送请求-查看响应流程二、新建请求三、选择请求方式&#xff0c;填写url1.发送get请求当只有请求方式不一样的时候&#xff0c;参数都填写在参数栏里面&#xff0c;GET请求与POST请求的区别&#xff1f; 2.发送post请求2.1 application/x-www-form-urlencoded2.2…

基于深度学习的SSVEP分类算法简介

基于深度学习的SSVEP分类算法简介 1、目标与范畴2、深度学习的算法介绍3、参考文献 1、目标与范畴 稳态视觉诱发电位&#xff08;SSVEP&#xff09;是指当受试者持续注视固定频率的闪光或翻转刺激时&#xff0c;在大脑枕-额叶区域诱发的与刺激频率相关的电生理信号。与P300、运…

C系列-柔性数组

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 ​编辑 柔性数组 柔性数组的特点 柔性数组的使用 柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组这个概念&#xff0c;但是它确实是存在的&#xff0c;C99中&#…

PyTorch 2.2 中文官方教程(十八)

开始使用完全分片数据并行&#xff08;FSDP&#xff09; 原文&#xff1a;pytorch.org/tutorials/intermediate/FSDP_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Hamid Shojanazeri&#xff0c;Yanli Zhao&#xff0c;Shen Li 注意…

Hudi学习 6:Hudi使用

准备工作&#xff1a; 1.安装hdfs https://mp.csdn.net/mp_blog/creation/editor/109689143 2.安装spark spark学习4&#xff1a;spark安装_hzp666的博客-CSDN博客 3.安装Scala Hudi学习6&#xff1a;安装和基本操作_hzp666的博客-CSDN博客 spark-shell 写入和读取hudi 2.…

python常用pandas函数nlargest / nsmallest及其手动实现

目录 pandas库 Series和DataFrame nlargest和nsmallest 用法示例 代替方法 手动实现 模拟代码 pandas库 是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间序列分析方面也有着出…

基于springboot地方美食分享网站源码和论文

基于springboot地方美食分享网站源码和论文361 首先&#xff0c;论文一开始便是清楚的论述了系统的研究内容。其次&#xff0c;剖析系统需求分析&#xff0c;弄明白“做什么”&#xff0c;分析包括业务分析和业务流程的分析以及用例分析&#xff0c;更进一步明确系统的需求。然…