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

news2024/9/8 23:10:30

    • 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.coloradmin.cn/o/1431992.html

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

相关文章

指针的学习2

目录 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 二级指针 指针数组 指针数组模拟二维数组 数组名的理解 数组名是数组首元素的地址 例外: sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的…

EasyCVR智能视频监控平台云台降低延迟小tips

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

彻底学会系列:一、机器学习之线性回归

1.基本概念 线性回归: 有监督学习的一种算法。主要关注多个因变量和一个目标变量之间的关系。 因变量: 影响目标变量的因素: X 1 , X 2 . . . X_1, X_2... X1​,X2​... ,连续值或离散值。 目标变量: 需要预测的值: t…

智慧未来已至:人工智能与数字孪生共筑城市新纪元

随着科技的飞速发展,人工智能与数字孪生技术正逐步成为智慧城市建设的核心驱动力。 这两项技术的结合,不仅将彻底改变城市的传统面貌,更将引领我们走向一个更加高效、便捷、绿色的未来。 一、智慧城市的新内涵 智慧城市,是指在城…

DDoS攻击:分布式拒绝服务攻击的威胁与对策

DDoS攻击:分布式拒绝服务攻击的威胁与对策 随着互联网的快速发展,网络安全威胁也在不断增加。其中,分布式拒绝服务攻击(DDoS)是一种常见且具有破坏性的攻击方式,给个人用户、企业和组织的网络基础设施带来了…

爬虫工作量由小到大的思维转变---<第四十五章 Scrapyd 关于gerapy遇到问题>

前言: 本章主要是解决一些gerapy遇到的问题,会持续更新这篇! 正文: 问题1: 1400 - build.py - gerapy.server.core.build - 78 - build - error occurred (1, [E:\\项目文件名\\venv\\Scripts\\python.exe, setup.py, clean, -a, bdist_uberegg, -d, C:\\Users\\Administrat…

React进阶 - 15(React 中 ref 的使用)

本章内容 目录 一、e.target 获取事件对应“元素”的DOM节点二、ref三、ref 和 setState 合用 上一节我们了解了 React中的”虚拟DOM“中的”Diff算法““ ,本节我们来说一说 React中 ref的使用 一、e.target 获取事件对应“元素”的DOM节点 打开之前工程中的 To…

elasticsearch重置密码操作

安装es的时候需要测试这个url:http://127.0.0.1:9200/ 出现弹窗让我输入账号和密码。我第一次登录,没有设置过账号和密码, 解决方法是:在es的bin目录下打开cmd窗口,敲命令:.\elasticsearch-reset-password…

给mysql设置时区

每次重启MySQL服务器后,使用IDEA的database navigator连接都会出现这种情况 解决方式就是 命令行登录后 set global time_zone 8:00;嘿嘿把之前自家简书文章 给mysql设置时区 搬运过来了,方便查阅

Zookeeper相关面试准备问题

Zookeeper介绍 Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,Zookeeper就负责通知已经在Zoo…

【lesson37】自己设计用户级缓冲区

文章目录 自己设计用户级缓冲区简易MyFILE_的结构fopen_的实现fputs_的实现fclose_的实现fflush_的实现 完整版代码 自己设计用户级缓冲区 因为用户缓冲区在FILE中,所以我们直接模仿C语言提供的文件操作接口,顺便实现缓冲区。 使用文件系统的框架&#…

C++ 图(三十八)【第四篇】

接下来,我们先学习一个概念,带有权值的图,其实就是每条边上有一个自己独立的值了,接下来我们来进行一个深入的了解吧。 1.带权值得的图的概念 在前面的课程中,图中的边都只是用来表示两个点之间是否存在关系&#xff…

SQL注入其他方法

此次实验因为环境问题很多无法复现,在此只讨论过程和方法 一、SQL注入之outfile注入 mysql的outfile的作用是导出文件,使用此方法的必要条件:(此方法成功率极低) 1、知道目标网站的物理路径; 2、%secur…

Python算法题集_螺旋矩阵

Python算法题集_螺旋矩阵 题目54:螺旋矩阵1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【检测4个方向】2) 改进版一【检测2个方向】3) 改进版二【可读性改进】 4. 最优算法 题目54:螺旋矩阵 本文为Python算法题集之一…

《Pandas 简易速速上手小册》第9章:Pandas 数据可视化(2024 最新版)

文章目录 9.1 Pandas 内置可视化工具9.1.1 基础知识9.1.2 重点案例:销售数据分析9.1.3 拓展案例一:产品评价统计9.1.4 拓展案例二:员工满意度分布 9.2 与 Matplotlib 和 Seaborn 集成9.2.1 基础知识9.2.2 重点案例:销售趋势分析9.…

「递归算法」:验证二叉搜索树

一、题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff…

vulhub中Apache APISIX 默认密钥漏洞复现(CVE-2020-13945)

Apache APISIX是一个高性能API网关。在用户未指定管理员Token或使用了默认配置文件的情况下,Apache APISIX将使用默认的管理员Token edd1c9f034335f136f87ad84b625c8f1,攻击者利用这个Token可以访问到管理员接口,进而通过script参数来插入任意…

110.乐理基础-五线谱-五线谱的速度

内容参考于:三分钟音乐社 上一个内容:五线谱的附点、休止符、连线、延音线-CSDN博客 上一个内容里练习的答案: 五线谱里的情绪与速度也是跟简谱里一样,详情看:音乐的速度 专栏里的内容,根据创建时间&…

CNN应用Keras Tuner寻找最佳Hidden Layers层数和神经元数量

介绍: Keras Tuner是一种用于优化Keras模型超参数的开源Python库。它允许您通过自动化搜索算法来寻找最佳的超参数组合,以提高模型的性能。Keras Tuner提供了一系列内置的超参数搜索算法,如随机搜索、网格搜索、贝叶斯优化等。它还支持自定义…

《Python 网络爬虫简易速速上手小册》第2章:网络爬虫准备工作(2024 最新版)

文章目录 2.1 选择合适的爬虫工具和库2.1.1 重点基础知识讲解2.1.2 重点案例:使用 Scrapy 抓取电商网站2.1.3 拓展案例 1:使用 Requests 和 BeautifulSoup 抓取博客文章2.1.4 拓展案例 2:使用 Selenium 抓取动态内容 2.2 设置开发环境2.2.1 重…