二叉树_堆

news2024/12/19 5:42:49

目录

一. 树(非线性结构)

1.1 树的概念与结构

1.2 树的表示

二. 二叉树

2.1 二叉树的概念与结构

2.2 特殊的二叉树

2.3 二叉树的存储结构

三. 实现顺序结构的二叉树

3.1 堆的概念与结构


一. 树(非线性结构)

1.1 树的概念与结构

概念:属于非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

• 有一个特殊的结点,称为根结点,根结点没有前驱结点。
• 除根结点外,其余结点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm ,其中每一  个集合Ti(1 <= i <= m) 又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱结点,可以有 0 个或多个后继。因此,树是递归定义的。

 上面那个就是一个树的结构,A就是那个特殊的结点,叫做根结点。而且每一个子树的根节点有且只有一个前驱,可以有0个或者多个后继。需要注意的是,树形结构中,子树之间不能有交集,否则就不是树形结构;子树是不相交的(如果存在相交就是图了,图以后得课程会有讲解);除了根结点外,每个结点有且仅有一个父结点,一棵N个结点的树有N-1条边。

1.2 树的表示

树的相关术语

  1. 父结点/双亲结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 
  2. 子结点/孩子结点:一个结点含有的子树的根结点称为该结点的子结点; 
  3. 结点的度:一个结点有几个孩子,他的度就是多少;
  4. 叶子结点/终端结点:度为 0 的结点称为叶结点;
  5. 分支结点/非终端结点:度不为 0 的结点;
  6. 兄弟结点:具有相同父结点的结点互称为兄弟结点(亲兄弟); 
  7. 结点的层次:从根开始定义起,根为第 1 层,根的子结点为第 2 层,以此类推;
  8. 树的高度或深度:树中结点的最大层次; 
  9. 结点的祖先:从根到该结点所经分支上的所有结点;
  10. 路径:一从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列;
  11. 子孙:以某结点为根的子树中任⼀结点都称为该结点的⼦孙;
  12. 森林:由 m(m>0) 棵互不相交的树的集合称为森林;

树的表示

树的基本形式我们已经知道了,相对于线性结构树的结构确实会复杂很多,我们要如何去表示树?要用什么方法去表示?对于树的表示方法我们其实有很多,比如双亲表示法、孩子表示法、孩子兄弟表示法等,但其实我们最常用的还是孩子兄弟表示法。

struct TreeNode
{
struct Node* child; // 左边开始的第⼀个孩⼦结点
struct Node* brother; // 指向其右边的下⼀个兄弟结点
int data; // 结点中的数据域
};

上面的是我们利用结构体写出的树的结构,利用了孩子兄弟表示法,具体是什么思路,下面我会给大家详细解释,如图:

上面通过图片的形式表示出来,大家可能会更清楚一点,首先树中的每一个结点都是一样的结构,有孩子和兄弟,就拿上图来说,首先A的孩子结点指向B,同时B的兄弟结点指向C,这样就可以满足B和C的父节点是A,与树的形状一致,同理B的孩子结点指向D,D的兄弟结点再指向E,E的兄弟结点再指向F,以此类推,我们就可以利用这个方法完成数的结构了。其实也是很好理解的。

数的实际应用场景:对于数的结构,虽然有些许复杂,但是在实际生活中还是有很多用处的,比如我们最常见的电脑磁盘,每一个文件下可能有多个文件,在这些子文件中可能还有很多文件,这样的结构其实就是和数的结构基本是一致的。

二. 二叉树

2.1 二叉树的概念与结构

数的结构是有些许复杂的,可能每一个结点可能会有不一样数量的孩子结点等,可能数量会非常多,所以我们来介绍一种比较常用的类型,叫做二叉树

在树形结构中,我们最常用的就是二叉树,一棵二叉树是结点的一个有限集合,该集合由一个根结点加上两棵别称为左子树和右子树的二叉树组成或者为空。
从上图可以看出二叉树具备以下特点:
1. 二叉树不存在度大于 2 的结点;
2. 二叉树的子树有左右之分,次序不能颠倒,因此 二叉树是有序树

对于任何的二叉树都是由下面几种复合而成的:

2.2 特殊的二叉树

满二叉树

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 K ,且结点总数是 2^k-1   ,则它就是满二叉树。

完全二叉树

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从 1 n 的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。

💡 二叉树性质
根据满二叉树的特点可知:
1)若规定根结点的层数为 1 ,则一棵非空二叉树的第i层上最多有 2^( i−1 )^个结点;
2)若规定根结点的层数为 1 ,则深度为 h 的二叉树的最大结点数是 2^h − 1;
3)若规定根结点的层数为 1 ,具有 n 个结点的满二叉树的深度 h = log2 (n + 1) ( log
以2为底, n+1 为对数);

2.3 二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
顺序结构 顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费,完全二叉树更适合使用顺序结构存储。因为我们知道完全二叉树是一个有序的二叉树,所以我们能根据它的顺序用数组来表述出来,一般我们示从左向右表示。
链式结构 :二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链表来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链。后面会学到高阶数据结构,如红黑树等会用到三叉链。

三. 实现顺序结构的二叉树

3.1 堆的概念与结构

现实中我们通常把(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。堆是一种特殊的二叉树,具备二叉树的性质以为,还有一些其他的性质。

堆其实结构上与二叉树是相同的,但是堆有小堆和大堆之分,当孩子结点始终要大于或等于父结点的时候,我们称之为小堆;相反,当父结点始终大于或等于孩子结点的时候,我们称之为大堆;

 堆具有以下性质

• 堆中某个结点的值总是不大于或不小于其父结点的值;
• 堆总是一棵完全二叉树;
💡 二叉树性质
• 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从
   0 开始编号,则对于序号为 i 的结点有:
1. 若 i>0 , i 位置结点的双亲序号: (i-1)/2 ; i=0 , i 为根结点编号,无双亲结点;
2. 若 2i+1<n ,左孩子序号: 2i+1 , 2i+1>=n 否则无左孩子;
3. 若 2i+2<n ,右孩子序号: 2i+2 , 2i+2>=n 否则无右孩子;

 本篇主要详细的讲了关于数的概念和结构,只有我们清楚了数的结构,是通过什么方法来实现的,我们在后续的学习中才会更加得心应手,后面一篇我会给大家详细讲解堆的实现,以及堆的向上调整法和向下调整法。

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

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

相关文章

linux0.11源码分析第一弹——bootset.s内容

&#x1f680;前言 本系列主要参考的《linux源码趣读》&#xff0c;也结合之前《一个64位操作系统的设计与实现》的内容结合起来进行整理成本系列博客。在这一篇博客对应的是《linux源码趣读》第一~四回 目录 &#x1f680;前言&#x1f3c6;启动后的第一步&#x1f4c3;启动区…

设计模式之桥接模式:抽象与实现之间的分离艺术

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 桥接模式概述与角色组成 想象一下你家里的电视遥控器&#xff0c;无论是索尼还是三星的电视机&#xff0c;遥控器的按键功能都差不多&#xff1…

【从零开始入门unity游戏开发之——C#篇17】C#面向对象的封装——类(Class)和对象、成员变量和访问修饰符、成员方法

文章目录 一、类和对象1、什么是类和对象&#xff1f;2、例子说明2.1 例子1&#xff1a;(1) **类的定义&#xff1a;**(2) **创建对象&#xff1a;**(3) **类和对象的关系&#xff1a;** 2.2 例子2&#xff1a;**类的比喻&#xff1a;****对象的比喻&#xff1a;**代码实例&…

在Ubuntu 22.04 LTS中使用PyTorch深度学习框架并调用多GPU时遇到indexSelectLargeIndex相关的断言失败【笔记】

在Ubuntu 22.04 LTS系统中&#xff0c;已安装配置好CUDA 12.4、cuDNN 9.1.1以及PyTorch环境 export CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 在PyTorch深度学习框架训练调用多GPU时&#xff0c;提示 indexSelectLargeIndex: block: [x, 0, 0], thread: [x, 0, 0] Assertion src…

FutureCompletableFuture实战

1. Callable&Future&FutureTask介绍 直接继承Thread或者实现Runnable接口都可以创建线程&#xff0c;但是这两种方法都有一个问题就是&#xff1a;没有返回值&#xff0c;也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景&#xff0c;而Fu…

[论文阅读笔记]-PalmTree: 学习一个用于指令嵌入的汇编语言模型

深度学习已在众多二进制分析任务中展示了其优势&#xff0c;包括函数边界检测、二进制代码搜索、函数原型推理、值集分析等。现有方案忽略了复杂的指令内结构&#xff0c;主要依赖于控制流&#xff0c;其中上下文信息是嘈杂的&#xff0c;并且可能受到编译器优化的影响。为了解…

CH582F BLE5.3 蓝牙核心板开发板 60MHz RAM:32KB ROM:448KB

CH582F BLE5.3 蓝牙核心板开发板 60MHz RAM:32KB ROM:448KB 是一款基于南京沁恒&#xff08;WCH&#xff09;推出的高性能、低功耗无线通信芯片CH582F的开发板。以下是该开发板的功能和参数详细介绍&#xff1a; 主要特性 双模蓝牙支持&#xff1a; 支持蓝牙5.0标准&#xff0…

数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?

TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…

《网络对抗技术》Exp9 Web安全基础

实验目标 理解常用网络攻击技术的基本原理。 实验内容 Webgoat实践下相关实验。 实验环境 macOS下Parallels Desktop虚拟机中&#xff08;网络源均设置为共享网络模式&#xff09;&#xff1a; Kali Linux - 64bit&#xff08;攻击机&#xff0c;IP为10.211.55.10&#xff09;…

Chrome 132 版本开发者工具(DevTools)更新内容

Chrome 132 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、使用 Gemini 调试 Network、Source 和 Performance Chrome 131 可以使用 Gemini 调试 CSS&#xff0c;现在可以调试更多模块了 与元素面板中的右键菜单类似&#xff0c;要打开 AI 辅助面板并开始与 …

消息系统之 Kafka

什么是消息系统 消息系统是专用的中间件&#xff0c;负责将数据从一个应用传递到另外一个应用。使应用只需关注于数据&#xff0c;无需关注数据在两个或多个应用间是如何传递的。 消息系统一般基于可靠的消息队列来实现&#xff0c;使用点对点模式或发布订阅模式。数据实时在…

Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程

目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件&#xff0c;适用于工程控制系统。它用于 Intel Edge Controls for Industrial&#xff08;Intel ECI 或 ECI&#xff09;&#xff0c;…

[2015~2024]SmartMediaKit音视频直播技术演进之路

技术背景 2015年&#xff0c;因应急指挥项目需求&#xff0c;我们实现了RTMP推送音视频采集推送&#xff08;采集摄像头和麦克风数据&#xff09;模块&#xff0c;在我们做好了RTMP推送模块后&#xff0c;苦于没有一个满足我们毫秒级延迟诉求的RTMP播放器&#xff0c;于是第一…

Ubuntu24.04 安装 visual studio code

# 导入软件包密钥 wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg# 添加官方库 echo "deb [arch…

docker 搭建自动唤醒UpSnap工具

1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件&#xff0c;进行配置&#xff1a; version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…

已解决:elasticsearch创建索引失败

报错信息 具体报错&#xff1a; org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonunknown setting [index.mappings.properties.category.analyzer] please check that any required plugins are installed…

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql

计算机视觉中的特征提取算法

摘要&#xff1a; 本文聚焦于计算机视觉中的特征提取算法&#xff0c;深入探讨尺度不变特征变换&#xff08;SIFT&#xff09;算法。详细阐述 SIFT 算法的原理&#xff0c;包括尺度空间构建、关键点检测、方向分配与特征描述子生成等核心步骤。通过 C#、Python 和 C 三种编程语…

Linux USB开发整理和随笔

目录 1 概述 2 硬件原理基础 2.1 USB发展 2.2 USB的拓扑 2.3 硬件接口 2.4 USB总线协议 2.4.1 通信过程 2.4.2 概念关系 2.4.3 管道PIPE 2.4.4 传输 2.4.5 事务 2.4.6 包结构与类型 2.4.6.1 令牌包 2.4.6.2 数据包 2.4.6.3 握手包 2.5 描述符 2.5.1 设备描述符…

从0开始深入理解并发、线程与登台通知机制

1、从0开始深入理解并发、线程与等待通知机制 为什么开发中需要并发编程&#xff1f; 从阿里、美团的岗位JD其实就能看出来&#xff0c;并发编程和性能优化是密切相关的&#xff0c;使用并发编程可以做到&#xff1a; (1)加快响应用户的时间 比如我们经常用的迅雷下载,都喜欢…