【夜深人静学数据结构与算法 | 第三篇】 二叉树

news2024/12/22 9:54:26

目录

 前言:

 二叉树:

二叉树的种类: 

二叉树的存储方式:

1. 链式存储

2. 数组存储

二叉树的遍历方式

深度优先遍历

广度优先遍历

总结:



 前言:

本文将会详细的介绍各种常见的树以及相对应的概念,存储方式,遍历方式。树是经典的数据结构,因此我们虽然不能做到手撕各种树结构,但也要做到心中有B树。

 二叉树:

        二叉树是一种非常重要的树形结构,是一种特殊的树形结构,它的每个节点最多只有两个子节点。通常把这些子节点称作其左子节点和右子节点。

        二叉树有许多应用,例如在搜索算法中经常用到。由于它具有以下几个重要的性质,因此在计算机科学中得到广泛应用:

  • 每个节点最多只有两个子节点;
  • 左子节点的键值总是小于其父节点的键值;
  • 右子节点的键值总是大于其父节点的键值;
  • 树中没有两个节点拥有完全相同的键值。

二叉树的种类: 

二叉树是一种树形结构,其中每个节点最多只有两个子节点。除此之外,二叉树还可以分为多种不同的类型。

        1. 普通二叉树: 普通二叉树(Binary Tree)没有什么特别的限制,只需每个节点最多有两个子节点即可。
        2. 满二叉树: 满二叉树(Full Binary Tree)是一种特殊的二叉树,在满二叉树中,每个节点要么没有子节点(即为叶子节点),要么有两个子节点。满二叉树的层数为 h 时,它的节点数是 2^h-1。
        3. 完全二叉树: 完全二叉树(Complete Binary Tree)是一种特殊的二叉树,除了最后一层,其他每一层的节点数都达到最大值。最后一层的节点必须全部靠左对齐。在完全二叉树中,可以将每个节点的编号进行按层编号,如果一个节点的编号为 i,则它的左子节点的编号为 2i,它的右子节点的编号为 2i+1。
        4. 平衡二叉树: 平衡二叉树(Balanced Binary Tree)是一种特殊的二叉树,在这种树中,每个节点的左右子树的高度差不能超过 1。这种树可以保证在最坏情况下,树的高度不超过 O(log n),因此查找、插入、删除等操作的时间复杂度表现非常好,为 O(log n)级别。
        5. 二叉搜索树: 二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,对于任何一个节点,它的左子树中所有节点的键值都小于它的键值右子树中所有节点的键值都大于它的键值这样,我们就可以用二叉搜索树进行快速查找、插入和删除等操作。如果二叉搜索树的节点按照中序遍历的顺序输出,那么就是一个升序序列。

        在二叉搜索树中,对于每个节点,它的左子树中所有节点的键值都小于它的键值,右子树中所有节点的键值都大于它的键值。因此,二叉搜索树中的元素是可以被快速地查找、插入和删除的。

重点介绍一下红黑树:

红黑树(Red-Black Tree)是一种自平衡的二叉查找树,它是由一些颜色为红色或者黑色的节点组成的。通过一些约束条件,红黑树保证了在最坏情况下也能进行快速的查找、插入和删除等操作。

红黑树的约束条件包含以下四点:

  • 1. 每个节点为红色或黑色;
  • 2. 根节点是黑色的;
  • 3. 每个叶子节点(NIL节点,即空节点)都是黑色的;
  • 4. 如果一个节点为红色,则它的两个子节点必须都是黑色的。

在这些约束条件下,红黑树拥有以下性质:

  • 1. 从根节点到叶子节点的所有路径上,黑色节点的数量必须相等;
  • 2. 任何一个节点的两个子树的高度差不能超过1。

通过这些约束条件和性质,红黑树将最坏情况下的复杂度从O(n)降低到O(log n)。因此,在实际应用中,红黑树往往用于需要快速查找、插入和删除等操作的场景,例如编译器、数据库等数据结构。

 自平衡是指当我们对一棵树进行插入或删除节点等操作时,根据某些特定的方法重新构造树的形状,让树的高度在某些比较严格的限制下保持最小,从而使得树的查询等操作的效率保持在一个较高的水平。

二叉树的存储方式:

1. 链式存储

链式存储是二叉树最常用的存储方式。在链式存储中,每个节点由三个部分组成:数据域、左子节点指针和右子节点指针。每个节点都指向其左右子节点的指针为空或者指向相应节点。因此,每个节点可以用一个 C++ 结构体来表示:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

2. 数组存储

数组存储是二叉树的另一种存储方式。在数组存储中,我们可以使用数组来表示一棵二叉树,数组中每个元素就代表一个二叉树的节点。具体地,我们可以按照二叉树的层次遍历顺序,把二叉树的节点从上到下、从左到右排列在数组中。如果一个节点的下标为 i,那么它的左子节点下标为 2i+1右子节点下标为 2i+2。叶子节点对应的数组元素为空。如果二叉树的层数为 h,这种存储方式需要使用 2^{h+1}-1 个元素

数组存储的优点是可以节省指针开销并且由于数组的特性,我们可以利用下标来快速访问我们想要访问的节点,但是必须预先分配足够的空间,并且不能很好地支持动态插入和删除等操作。因此,在实际应用中,链式存储更为常用。

综上,二叉树的存储方式有链式存储和数组存储两种,链式存储是最常用的一种存储方式,而数组存储则更适合静态二叉树。

二叉树的遍历方式

  • 深度优先遍历

    • 前序遍历(递归法,迭代法)
    • 中序遍历(递归法,迭代法)
    • 后序遍历(递归法,迭代法)
  • 广度优先遍历

    • 层次遍历(迭代法)

        深度优先搜索(Depth-First Search, DFS)和广度优先搜索(Breadth-First Search, BFS)都是图搜索算法,用于在图中查找特定的节点或寻找一条路径。它们都属于盲目搜索算法,也就是不使用任何启发式信息来指导搜索。它们的主要区别在于搜索过程中节点的遍历顺序。

        深度优先搜索从起点节点开始,每次尽可能沿着一条未被探索的分支一直搜索下去,直到到达最深处,然后回溯到前一个节点,继续搜索下一个分支。这个过程类似于树的深度优先遍历。

        广度优先搜索从起点节点开始,每次先访问起点的所有邻居节点,然后访问所有邻居节点的邻居节点,然后再访问邻居节点的邻居节点的邻居节点,依次类推。这个过程结构类似于树的广度优先遍历。

        一般来说,如果我们想要在连通的图中搜索到所有的节点,我们通常会采用广度优先搜索。而如果我们只是需要在树或图中搜索一个可能存在于远离根部的分支的目标节点,那么可以使用深度优先搜索来快速找到目标节点。深度优先搜索也可以被用于选择最优解的应用,例如AI博弈。

        二叉树的遍历是一种递归算法,每个节点都会被访问到且仅被访问一次。二叉搜索树的查找、插入和删除操作也是基于递归算法实现的。

图解前中后序遍历:

前序遍历:遍历节点方式为中左右

 中序遍历:遍历节点方式为左中右

 后序遍历:遍历节点方式为左右中

总结:

        本篇我们对二叉树的各项基础概念做了介绍,下几篇我们将会针对几个比较常见的树,进行手撕解析,带领大家探寻树这种数据结构的奥妙。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

iTOP-RK3588 | Linux系统和应用开发手册

iTOP -RK3588开发板使用手册上新,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 迅为RK3588开发板已经对Linux系统完成适配,同时新增了对应的文档教程辅助大家参考学习——《itop-3588开发板Linu…

戴着很舒服的蓝牙耳机推荐,佩戴舒适度高的蓝牙耳机分享

​无论是日常通勤还是运动健身,相信大多数朋友都喜欢一边在朝夕的奔波路上,或是休息锻炼的闲散时间中,一边听着好听的音乐营造一份轻松愉悦的氛围感来放松自己的心情。随着蓝牙耳机的增长和功能增加,很多用户找不到一款好用且适合…

从乐观到悲观:MySQL中不同类型的锁全面解析

大家好,我是你们的小米!今天我要和大家分享关于MySQL的乐观锁和悲观锁,以及不同类型的锁。锁作为数据库中重要的概念之一,对于保证数据的一致性和并发性至关重要。现在就让我们一起来深入了解吧! 为什么需要锁 在并发…

Android Compose UI实战练手----Google Bloom欢迎页

目录 1.概述2.效果图展示2.1 亮色主题效果:2.2 深色主题效果 3.项目结构解析3.1 颜色配置Color.kt3.2 形状配置Shape.kt3.3 主题配置Theme.kt3.4 字体配置 Type.kt 4.沉浸式状态栏适配5.UI界面分解及实现5.1 欢迎页背景内容5.2 欢迎页内容组件实现 5.3 欢迎页内容的…

自动化测试成熟度模型

目录 前言: 重新认识自动化测试 新手落地自动化测试 自动化测试成熟度模型 初级阶段-测试半自动化 中级阶段-回归测试自动化 高级阶段-大范围自动化测试 成熟阶段-自动化测试流水线 前言: 随着软件行业的快速发展,软件质量已经成为各…

chatgpt赋能python:Python如何绘制坐标轴

Python如何绘制坐标轴 在数据可视化中,坐标轴是一种非常常见的图形元素,其作用是让人们更好地理解和分析数据。在Python编程中,我们可以使用各种数据可视化库如Matplotlib和Seaborn来绘制坐标轴。本文将介绍如何使用Matplotlib库来绘制坐标轴…

17. 数据结构之图

前言 前面介绍了队列,栈等线性数据结构,二叉树,AVL树等非线性数据结构,本节,我们介绍一种新的非线性数据结构:图。图这种结构有很广泛的应用,比如社交网络,电子地图,多对…

【JVM篇】Java内存区域与OOM

目录 1、概述 2、运行时数据区域 3、程序计数器 4、Java虚拟机栈 5、本地方法栈 6、Java堆 7、方法区 8、运行时常量池 9、直接内存 1、概述 内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM…

Windows Server 2025预览版安装配置

一、安装篇 1.2.目前最新版是 25379版本,需要注册微软账户,加入先期预览计划才可以下载。 下载完镜像后,制作U盘启动盘,安装。 注意:无论是rufs制作启动盘,还是在安装的时候,都要使用UEFI模式…

Spring boot开发微信小游戏后台-websocket服务

最近在做一个微信小游戏的后台,需要使用websocket与小游戏端建立连接,实时推送数据,小游戏后台是一个单体spring boot项目,管理玩家的一些基础信息和游戏配置信息,起初在这个单体项目中加入了websocket,可以…

spring boot+easyui粮油质量管控防伪溯源系统源码

基于物联网技术、RFID技术和RSA、PGP加密算法开发的粮油质量追溯系统 粮油安全关系千千万万消费者的健康问题。近年来,许多食品行业安全事故频频涌现,成为社会关注焦点。粮油生产加工质量管控防伪溯源系统为粮油提供从种植、生产、加工、销售等各环节的…

Linux下实现自己的printf函数

Linux下实现自己的printf函数 文章目录 Linux下实现自己的printf函数项目中的使用实现自己的printf函数 项目中的使用 /*********************************************************************** 函数名称: DebugPrint* 功能描述: 打印信息的总入口函…

Nodejs四、npm与包

零、文章目录 Nodejs四、npm与包 1、包 (1)包是什么 Node.js 中的第三方模块又叫做包。就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一个概念,只不过叫法不同。 (2)包的来源 不同于 Nod…

Linux SSH PublicKey 登录

前言 ssh 远程登录密码认证的方式有 Password、Keyboard Interactive 和 Public Key 三种主要方式。 前面两种方式就是密码认证,含义都是一样大同小异。第三种是登录方式最安全的一种,也是我们常用的云服务器默认使用的一种方式。 本文就如何配置并使用…

torchvision.ops.nms实现NMS

nms原理&#xff1a; 当目标检测模型对一个目标有多个检测框时&#xff0c;需要滤掉多余的框&#xff0c;留下最接近真实目标的框。 步骤是这样的&#xff1a; 1.先把目标框初筛一波&#xff0c;比如设阈值为0.25, 把预测概率 < 0.25的目标框滤掉。 2.把 每个类别的 目标框 …

DEVONthink 3:Mac文档管理工具,知识管理app

DEVONthink Pro是一款功能强大的文档管理软件&#xff0c;它可以帮助用户高效地组织、管理和查找各种类型的文件和信息。 下面是DEVONthink Pro的主要特点介绍&#xff1a; 多功能性&#xff1a;DEVONthink Pro支持多种文件类型和数据源&#xff0c;并提供全面的搜索、分类、过…

在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P1)

小伙伴们大家好&#xff0c;今天瑞云渲染小编给大家分享的是自由CG艺术家Jean Zoudi创建《极乐迪斯科》的警探角色的项目花絮&#xff0c;会解释身体和服装的建模方式&#xff0c;分享角色发型和面部毛发背后的工作流程&#xff0c;也会详细介绍渲染过程。 介绍 大家好&#…

性能测试怎么做?性能测试策略配套适用场景,打通性能测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、常见的测试策略…

直流对数放大器

Logarithmic Amplifiers 对数放大器的应用场合 在雷达和一些其他测距的场合&#xff0c;sensor输出的信号的动态范围比较宽&#xff0c;也就是要求sensor输出的弱信号时有比较大的放大倍数&#xff0c;强的信号有较小的放大倍数&#xff0c;以保证sensor输出的信号经过放大器后…

可移动硬盘无媒体是什么意思?移动硬盘显示无媒体数据如何恢复

案例分享&#xff1a;【最近我遇到了一个麻烦&#xff0c;我的移动硬盘突然显示“无媒体”。我不知道发生了什么&#xff0c;我很担心我的硬盘中存储的大量重要数据是否还能恢复。我该怎么解决移动硬盘显示无媒体问题呢&#xff0c;求大神帮帮我吧&#xff01;&#xff01;&…