二叉树与堆的深度解析:数据结构中的关键概念及应用

news2024/11/15 23:45:12

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

.

个人主页:晓风飞
专栏:数据结构|Linux|C语言
路漫漫其修远兮,吾将上下而求索



前言

在计算机科学的丰富和多样的领域中,数据结构扮演着核心角色。特别是树和堆,作为高效组织和处理数据的关键结构,它们在算法设计和系统实现中占据着重要位置。从文件系统的层次组织到优先队列的管理,理解这些结构的基础原理对于深入掌握计算机科学至关重要。本文旨在深入探讨树和堆的基本概念、性质及其在实际中的应用,为初学者和有志者提供一个明确的理解路径。


树概念

树是一种非线性数据结构,由n(n≥0)个节点构成,这些节点形成了一个具有明确层次的集合。这种结构被称为‘树’,因为它类似于一棵倒置的真实树,即其根部位于顶部,而叶节点则位于底部。

在这种结构中,有一个特殊的节点称为根节点,它是唯一一个没有前驱(即父节点)的节点。
除了根节点,其他所有节点被划分为M(M>0)个互不相交的子集T1、T2、……、Tm。每个子集Ti(1≤i≤m)本身又构成一棵结构上与原树相似的子树。”每棵子树的根节点恰有一个前驱(父节点)且可能有多个后继(子节点)。这种自相似的性质是树的一个关键特征,体现了其递归定义。。

在这里插入图片描述

注意:

树形结构中,子树之间不能有交集,否则就不是树形结构


树的基本概念及术语

基本概念及术语

根节点:想象一棵倒立的树,最顶部的那个点是根节点。在数据结构的树中,所有结构都是从这个根节点展开的。
节点:树中的每一个点称为节点,类似于树的小枝,可以向外延伸形成更多分支。
叶节点:位于树底部的节点,没有子节点,就像树上的叶子。
子树:从树中任一节点向下的部分,可以看作是一棵独立的、较小的树。
节点的度:一个节点含有的子树数量。例如,如果节点A有6个子树,那么A的度是6。
非终端节点/分支节点:度不为0的节点,即含有子节点的节点。
双亲节点/父节点:含有子节点的节点,这个节点是其子节点的父节点。
孩子节点/子节点:一个节点的直接下级节点。
兄弟节点:拥有相同父节点的节点。
树的度:树中所有节点的度中的最大值。
节点的层次:从根节点开始,根节点是第1层,其子节点是第2层,依此类推。
树的高度/深度:树中节点的最大层次数。
堂兄弟节点:父节点处于同一层的节点。
节点的祖先:从根节点到该节点路径上的所有节点。
子孙:某节点的所有下级节点。
森林:由多棵互不相交的树组成的集合。

以家谱为例

家谱中的曾祖父是根节点。
他的孩子(例如父亲和父亲的兄弟姐妹)是中间节点。
孙子辈(例如你)是叶节点。
在这个例子中,每一代都可以视作一个单独的“子树”。


树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间
的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法
等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

孩子兄弟表示法简介

在孩子兄弟表示法中,每个节点存储两个指针:
孩子指针:指向该节点的第一个孩子。
兄弟指针:指向同一父节点的下一个兄弟。

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

在这里插入图片描述

优势

使用孩子兄弟表示法的主要优点是它可以将任何复杂的树结构转换为类似二叉树的形式。这种转换使得对树的操作(如遍历、搜索等)更加统一和简化。此外,这种方法也便于处理树中节点数量变化的情况,如添加或删除子节点。

应用示例

假设我们有一个节点A,它有三个子节点B、C和D。在孩子兄弟表示法中,节点A的孩子指针指向B,B的兄弟指针指向C,C的兄弟指针指向D。这样,我们就可以通过节点A访问到它的所有子节点。


树在实际中的运用

文件系统的目录树结构

基本概念:在大多数操作系统中,文件和目录(文件夹)都是以树形结构组织的。这种结构允许用户方便地存储、访问和管理文件。

根目录:这个目录位于层级结构的顶部,相当于数据结构中的根节点。所有其他文件和目录都从这里开始分支。

目录和子目录:每个目录都可以包含文件或其他子目录(子节点)。这类似于树结构中的中间节点。

文件:位于树结构末端的文件类似于叶节点,它们不包含其他子目录或文件。

优点

组织性:树结构提供了一种清晰的方式来组织文件和目录,使得查找和访问文件变得直观和高效。
层级清晰:用户可以通过树的层级结构轻松地导航到特定文件或目录。
路径表示:文件的路径表示其在树结构中的位置,从根目录开始,通过各级子目录直到文件本身。

实例

想象您的电脑上有一个“文档”文件夹(目录)。在这个文件夹中,您可能有“工作”和“个人”这两个子文件夹。在“工作”文件夹中,您可能有不同的项目文件夹,每个项目文件夹中可能又有不同的文档和文件,依此类推。

Windows中的树

在Windows操作系统中,文件系统的树结构通常通过资源管理器来可视化展示。这种表示方法有以下特点:
根节点:通常是驱动器,如C盘、D盘等。它们代表文件系统的起始点。

目录和子目录:每个驱动器下可以有多个目录(文件夹),并且每个目录可以进一步包含子目录。这些目录和子目录在树状结构中充当中间节点。

文件:位于树的末端,相当于叶节点。它们不包含进一步的子目录或文件。

在这里插入图片描述

Linux中的树

在这里插入图片描述
Linux操作系统中的文件系统结构与Windows类似,但有其特有的组织方式:

根目录:在Linux中,有一个全局的根目录“/”,它是文件系统的最顶层。

目录结构:从根目录延伸出来的各种目录,如“/home”、“/usr”等,以及它们的子目录。这些目录在树状结构中作为中间节点。

文件:这些是树结构的叶节点,表示实际的数据存储。

树结构的视觉表示

这两个系统中树的视觉表示帮助用户理解文件和目录之间的层级关系。用户可以轻松地浏览不同的目录层级,找到存储在不同位置的文件。


二叉树概念及结构

二叉树是计算机科学中的一种重要数据结构,具有以下特点:

基本定义

有限节点集合:二叉树是由节点组成的有限集合,这个集合可以为空,或者由一个根节点和两棵子树(左子树和右子树)构成。

空二叉树:如果这个集合为空,则称为一个空二叉树。

非空二叉树:包含一个根节点,以及可能为空的左子树和右子树,这两棵子树本身也是二叉树。

特点

度的限制:二叉树中不存在度大于2的节点。这意味着任何节点最多只有两个子节点:一个左子节点和一个右子节点。

有序性:二叉树的子树具有左右之分,且次序不能颠倒。因此,二叉树是一种有序树。

结构的多样性:任何二叉树都可以由更简单的二叉树通过添加左子树和/或右子树来构造。这表明二叉树具有递归的性质。

递归定义

二叉树的定义具有递归性质:一个二叉树的左子树和右子树本身也是二叉树。这种递归定义使得操作和算法设计在二叉树上可以高效实施。

在这里插入图片描述
从上图可以看出:
1.二叉树不存在度大于2的结点
2二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的:
在这里插入图片描述

应用场景

二叉树在计算机科学中被广泛应用于多种场景,例如:

搜索树:如二叉搜索树,用于高效的数据搜索和访问。
堆结构:在优先队列和堆排序中使用。
哈夫曼树:在数据压缩算法中使用。


二叉树的性质

二叉树的性质

1.第i层的最大节点数:非空二叉树的第i层最多有 2^(i-1) 个节点(根节点层数为1)。
2.深度为h的二叉树的最大节点数:深度为h的二叉树最多有 2^h - 1 个节点。
3.叶节点和分支节点的关系:对任何非空二叉树,若叶节点数为n0,度为2的节点数为n2,则有 n0 = n2 + 1。
4.满二叉树的深度:具有n个节点的满二叉树的深度h为 ceil(log2(n+1))。

完全二叉树的节点关系:

->1.若i>0,则节点i的父节点为 (i-1)/2;若i=0,则i为根节点。
->若2i+1 < n,则节点i的左孩子为 2i+1;否则无左孩子。
->若2i+2 < n,则节点i的右孩子为 2i+2;否则无右孩子。


二叉树的存储结构

顺序存储

定义:使用数组来存储二叉树的节点。
适用性:适合完全二叉树,非完全二叉树会造成空间浪费。
物理和逻辑结构:物理上是数组,逻辑上是二叉树。

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空
间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺
序存储在物理上是一个数组,在逻辑上是一颗二叉树。

链式存储

二叉链:

Copy code
typedef int BTDataType;
struct BinaryTreeNode {
    struct BinaryTreeNode* _pLeft; // 指向左孩子
    struct BinaryTreeNode* _pRight; // 指向右孩子
    BTDataType _data; // 节点值
};

三叉链:

struct BinaryTreeNode {
    struct BinaryTreeNode* _pParent; // 指向父节点
    struct BinaryTreeNode* _pLeft; // 指向左孩子
    struct BinaryTreeNode* _pRight; // 指向右孩子
    BTDataType _data; // 节点值
};

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是
链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所
在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程
学到高阶数据结构如红黑树等会用到三叉链。

在这里插入图片描述


堆的概念及结构

堆是一种特殊的完全二叉树,主要用于实现优先队列。在堆中,每个节点的值都遵循特定的顺序规则,与其父节点的值有一定的关系。堆分为最大堆和最小堆两种类型:

最大堆(大根堆)

定义:堆中任意节点的值不小于其子节点的值。
特性:根节点是所有节点中的最大值。

在这里插入图片描述

最小堆(小根堆)

定义:堆中任意节点的值不大于其子节点的值。
特性:根节点是所有节点中的最小值。
在这里插入图片描述

存储方式

数组存储:堆通常使用数组来实现,按照完全二叉树的顺序存储方式存储在一维数组中。

堆的性质

节点顺序:堆中某个节点的值总是不大于(在最大堆中)或不小于(在最小堆中)其父节点的值。
完全二叉树:堆总是一棵完全二叉树,这意味着除了最底层,其他层都是满的,并且最底层的节点尽可能地集中在左侧。

操作

插入:将新元素添加到堆的末尾,然后向上调整以恢复堆的顺序。
删除(最大堆中删除最大元素,最小堆中删除最小元素):通常删除根节点,然后将最后一个元素移动到根节点位置,并向下调整以恢复堆的顺序。


结语

通过本文的探索,我们不仅理解了树和堆作为数据结构的基本特征和原理,而且还了解到了它们在现实世界中的应用。从理论到实践,树和堆展现了数据组织和处理的高效性与灵活性。无论是在软件开发、系统设计还是在解决复杂的编程问题中,这些知识都是不可或缺的。希望本文能激发您对数据结构更深入的兴趣,并在您的计算机科学旅程中起到助力作用。

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

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

相关文章

【Maven笔记3】Maven基础入门案例

本篇通过一个最基础的入门案例&#xff0c;熟悉一下maven最基础的使用方法。 编写POM maven项目的核心是pom.xml文件&#xff0c;pom定义了项目的基本信息&#xff0c;用于描述项目如何构建&#xff0c;声明项目依赖等等。 这里我们新建一个maven-demo-hello项目&#xff0c;…

VS Code结合Live Server插件快速搭建小游戏并发布至公网可随时远程访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程&#xff0c;我们将通过VS Code实现远程开发MENJA小游戏&#xff0c;并通过cpolar内网穿透发布到公网&#xff0c;分…

黑莓系统的安全性如何?

黑莓系统的安全性非常高&#xff01; 在过去很长一段时间里&#xff0c;都被认为是手机市场上最安全的操作系统。这主要得益于黑莓在安全性方面的重视和投入。 &#xff08;在世界上最安全的 6 款手机排名中&#xff0c;iPhone未能入围&#xff09; 世界上最安全的 6 款手机&…

CNN——ResNet

深度残差网络&#xff08;Deep residual network, ResNet&#xff09;的提出是CNN图像史上的一件里程碑事件&#xff0c;并且让深度学习真正可以继续做下去&#xff0c;斩获2016 CVPR Best Paper。此外ResNet的作者都是中国人&#xff0c;一作何恺明。ResNet被提出以后很多的网…

Mac 16g约等于Windows多少g?

Mac 16g 内存等于 Windows 320g 内存 何为“黄金内存”&#xff1f; Mac 的内存是用黄金做的&#xff0c;而 Windows 的内存是用铁做的。 黄金的密度是 19.32 g/cm&#xff0c;而铁的密度是 7.874 g/cm。 因此&#xff0c;16g 的黄金体积是 0.082 cm&#xff0c;而 16g 的铁…

交换机_05VLAN

一、VLAN技术的引入 VLAN&#xff08;Virtual Lan&#xff09;主要应用在交换机上 一台交换机默认情况下连接一个广播域&#xff0c;因为默认情况下所有的接口都是属于同一个vlan的&#xff0c;默认vlan1&#xff0c;所以是在同一个广播域中。 结合交换机工作原理&#xff0…

Python 利用PYQT5设计基于RSA算法盲签名的匿名化电子支付系统设计与实现

基于RSA算法的盲签名算法 David Chaum 于1982年提出盲签名的概念&#xff0c;并利用RSA算法设计了第一个盲签名方案. 该方案的安全性基于大整数分解问题 盲签名的步骤 1.密钥生成 签名者执行以下步骤生成密钥对: ①签名者选择两个大素数p,q&#xff0c; 计算npq&#xff0…

OpenCV-18图像的翻转和旋转

一、图像的翻转 使用API---cv.flip&#xff08;src, flipCode&#xff09; flipCode 0表示上下翻转 flipCode > 0表示左右翻转 flipCode < 0上下 左右翻转 或者使用np的翻转src[: : -1,: : -1]实现上下翻转。 示例代码如下&#xff1a; import cv2 import numpy…

GPT(Generative Pre-Training)论文解读及源码实现(二)

本篇为gpt2的pytorch实现&#xff0c;参考 nanoGPT nanoGPT如何使用见后面第5节 1 数据准备及预处理 data/shakespeare/prepare.py 文件源码分析 1.1 数据划分 下载数据后90%作为训练集&#xff0c;10%作为验证集 with open(input_file_path, r) as f:data f.read() n …

yolo 分割label格式标注信息图片显示可视化查看

参考: https://github.com/ultralytics/ultralytics/issues/3137 https://blog.csdn.net/weixin_42357472/article/details/135218349?spm=1001.2014.3001.5501 需要把坐标信息在图片上显示 代码 1)只画出了坐标边缘 import cv2 import numpy as np from random impor…

html 原生网页使用ElementPlus 日期控件el-date-picker换成中文

项目&#xff1a; 原生的html,加jQuery使用不习惯&#xff0c;新html页面导入vue3,element plus做界面&#xff0c;现在需要把日历上英文切成中文。 最终效果&#xff1a; 导入能让element plus日历变成中文脚本&#xff1a; elementplus, vue3对应的js都可以通过创建一个vu…

idea 以文本形式输出 SpringBoot项目 目录结构

第1步&#xff1a;AltF12 打开 Terminal 终端 第2步&#xff1a;cd 到 项目路径下 第3步&#xff1a;使用 tree 命令 结果 D:. ├─.mvn │ └─wrapper ├─applog │ └─logs ├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─zhangziwa …

【软件测试】学习笔记-如何做好单元测试

什么是单元测试&#xff1f; 在正式开始今天的话题之前&#xff0c;我先给你分享一个工厂生产电视机的例子。 工厂首先会将各种电子元器件按照图纸组装在一起构成各个功能电路板&#xff0c;比如供电板、音视频解码板、射频接收板等&#xff0c;然后再将这些电路板组装起来构…

【计算机网络】网络编程套接字socket--UDP/TCP简单服务器实现/TCP协议通信流程

文章目录 一、预备知识1.IP和端口号2.TCP协议和UDP协议3.网络字节序 二、socket编程接口1.socket 常见API2.sockaddr结构 三、UDP服务器相关重要接口介绍sendtorecvfrompopen 1.udpServer.hpp2.udpServer.cc3.udpClient.hpp4.udpClient.cc5.onlineUser.hpp 四、TCP服务器socket…

高性能、可扩展、分布式对象存储系统MinIO的介绍、部署步骤以及代码示例

详细介绍 MinIO 是一款流行的开源对象存储系统&#xff0c;设计上兼容 Amazon S3 API&#xff0c;主要用于私有云和边缘计算场景。它提供了高性能、高可用性以及易于管理的对象存储服务。以下是 MinIO 的详细介绍及优缺点&#xff1a; 架构与特性&#xff1a; 开源与跨平台&am…

HTML---JavaScript操作DOM对象

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 了解DOM的分类和节点间的关系熟练使用JavaScript操作DOM节点 访问DOM节点 能够熟练的进行节点的创建、添加、删除、替换等 能够熟练的设置元素的样式 能够灵活运用JavaScript获取元素…

SpringBoot学习(八)-SpringBoot + Dubbo + zookeeper

分布式DubboZookeeper 1、分布式理论 1&#xff09;什么是分布式系统&#xff1f; 在《分布式系统原理与范型》一书中有如下定义&#xff1a;“分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统”&#xff1b; 分布式系统是由一组通过…

【AI视野·今日CV 计算机视觉论文速览 第284期】Fri, 5 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 5 Jan 2024 Totally 62 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning to Prompt with Text Only Supervision for Vision-Language Models Authors Muhammad Uzair Khattak, Muhammad F…

2024.1.7-实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功)

实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功) 目录 最终效果 原文链接 https://onedayxyy.cn/docs/prometheus-grafana-ecs 参考模板 https://i4t.com/ https://grafana.frps.cn &#x1f530; 额&#xff0c;注意哦: 他这个是通过frp来…

【Flutter 开发实战】Dart 基础篇:从了解背景开始

想要学会用 Flutter 开发 App&#xff0c;就不可避免的要学习另一门很有意思的编程语言 —— Dart。很多小伙伴可能在学习 Flutter 之前可能都没听说过这门编程语言&#xff0c;我也是一样&#xff0c;还以为 Dart 是为了 Flutter 而诞生的&#xff1b;然而&#xff0c;当我们去…