【数据结构】完全二叉树——啊堆堆堆

news2025/1/11 18:49:14

一、树概念及结构

    • 树的概念

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

-> 有一个特殊的节点,称为根节点,该节点没有前驱节点。

-> 除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1, T2, . . . . . TM。其中每一个集合Ti(1 <= i <= M)又是一颗结构与树类似的子树。每颗子树的根节点有且只有一个前驱,可以有0个或多个后继。

-> 因此,树是用递归定义的。

左图来自百度

PS: 树形结构中,子树之间不能有交集,否则就不是树形结构。
->子树是 不相交的
-> 除了根节点外,每个节点 有且仅有一个父节点;
-> 一个 N个节点的树有 N - 1条边

2. 树的相关概念

->节点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的度为6。
->叶节点或终端节点:度为0的节点称为叶节点;如上图:B,C,H,I,K,L,M,N,P,Q都是叶节点。
->非终端节点或分支节点:度不为0的节点;如上图:D,E,F,G,J都是分支节点。
->双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点。
->孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点。
->兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点。
->树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6。
->节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
->树的高度或深度:树中节点的最大层次; 如上图:树的高度为4。
->堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点。
->节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先。
->子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙。
->森林:由m(m>0)棵互不相交的树的集合称为森林。

二、二叉树概念及结构

1.二叉树的概念

一颗二叉树是节点的一个有限集合,该集合:
->由一个根节点加上两颗别称为左子树和右子树的二叉树组成。
->或者为空。
从上图可以看出:
二叉树不存在度大于2的节点。
二叉树的子树有左右之分,次序不能颠倒,所以二叉树是一个有序树。
注意:对于任意的二叉树都是由以下几种情况复合而成的。

2.特殊的二叉树

(1) 满二叉树:

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

(2) 完全二叉树:

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。(通俗来讲,完全二叉树其实就是一颗高度为N的树,它的前N-1层都是满的,而第N层从左到右是连续的)。

3. 二叉树的性质

1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1)个结点.

2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2^h - 1.

3. 对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为 n2,则有 n0= n2 +1

4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度h=

5. 对于具有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否则无右孩子。

三、二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。

  1. 顺序结构:

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

  1. 链式结构:

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。

四、二叉树的顺序结构及实现(Heap)

    • 二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

2. 堆的概念及结构

如果有一个关键码的集合K = { K0, K1, K2, …… , K(n-1) },把它的所有元素按照完全二叉树的顺序存储方式存储在一个一维数组中,并满足:K[i] <= K[2*i + 1] 且 K[i] <= K[2*i + 2] ( K[i] >= K[2*i + 1] 且 K[i] >= K[2*i + 2]) i = 0, 1, 2……,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或者大根堆,根节点最小的堆叫做最小堆或者小根堆。

堆的性质:
->堆中的某个节点的值总是不大于或不小于其父节点的值。
-> 堆总是一颗完全二叉树。

3. 堆(Heap)的实现

3.1 堆向下调整算法

现在我们给出一个数组,在逻辑上我们可以将它看成是一颗完全二叉树。我们通过从根节点开始的向下调整算法将它调整成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆才能进行调整。

向下调整算法过程(以下为小堆):

  1. 用parent指向需要调整的节点,child指向其左孩子,如果child+1也在需要调整的范围内并且child+1指向的节点的值小于child指向节点的值,那么就让child++。目的是为了让child指向左右孩子中小的那一个节点。(如果是大堆,就让child指向左右孩子中大的那一个节点)

  1. 判断parent与child分别指向节点的值,如果parent所在节点的值小于child所在节点的值。那么我们就让parent与child两个节点的值进行交换。

  1. 交换后,让parent=child,child=2*parent+1。然后重复以上操作,直到将整棵树调整完。

该算法时间复杂度:O() ->N为节点个数,即数组元素个数,向下调整次数最多为完全二叉树的高度。

3.2 堆的创建

前面我们讲到堆向下调整算法,但是这个算法使用的时候有一个前提,就是我们的左右子树必须都是一个堆。那么,对于正常的数组而言,要满足这个条件是非常困难的。所以我们就要创建堆,现在给出一个数组,我们想要将它调整成一个小堆。此时数组在逻辑结构上可以看成一棵完全二叉树,但并不是一个堆,接下来我们就对它进行调整。

代码实现:

通过向下调整算法,我们就可以实现将一个数组建立成堆。

3.3 建堆时间复杂度分析

因为数组可以看作是一颗完全二叉树,而满二叉树是一颗特殊的完全二叉树,所以下面就用满二叉树来进行证明:

因此:建堆的时间复杂度为O(N)。

3.4 堆的插入

堆的插入是指在数组的尾部插入一个数,然后进行向上调整,将尾部数据调整到合适的位置使整个数组符合堆的性质:

向上调整算法:

有了向上调整算法后,现在我们又多了一种建堆方法,向上调整算法,我们可以把给定数组当作一个从0个元素开始逐渐向堆中插入数据的堆,也就是我们可以从根节点的第一个孩子节点开始,然后向上调整,直至将整个数组调整成一个堆。

向上调整算法时间复杂度分析:

所以:向上调整建堆算法时间复杂度为O(N*logN)

我们可以看出,向上调整算法在时间复杂度上相比于向下调整算法是比较差的。所以,一般在给定数组的情况下我们通常选择的是向下调整算法来进行建堆。

3.5 堆的删除

堆的删除一般是指将堆顶的元素删除,然后继续调整,使它仍然是一个堆。我们一般是将堆顶元素与最后一个元素进行交换,然后进行向下调整。(这里我们只提一下关于堆的删除的思想,下面我们将会用到这个思想)

4. 堆的应用

4.1 堆排序

给定一个数组,对它进行排序,我们应该怎样实现它的排序呢?这里就要用到我们的堆排序。堆排序的前提是我们的数组首先得是一个堆,然后我们才能进行排序。所以,在实现堆排序之前我们还要将数组中的元素调整成为一个堆。

堆排序分以下两个步骤:

  1. 建堆->升序排序建大堆,降序排序建小堆

  1. 利用堆删除思想来进行排序

这里利用降序排序来进行演示(由于前面我们的向下调整算法是实现的小堆,我们就演示降序)

重复以上操作,就可以对数据进行降序排序了,这里只演示了两趟,剩下的操作类似就不再演示了。

代码实现:

4.2 TopK问题

对于大量的数据而言,我们应该怎么通过O(N)的时间复杂度来将其中最大的几位数据找到呢?由于数据量太大,我们不能通过排序来进行求解。这里就可以用我们的TopK算法。通过O(N)的时间复杂度来进行求解:

  1. 利用数据中前k个元素进行建堆(求最大的k个就建立小堆,最小的k个就建立大堆)

  1. 将剩下的N-k个元素与堆顶元素进行比较,不满足就替换堆顶元素

所有数据比较完之后,堆中就剩下最大(最小)的k个数据了。

示例:

运行结果:

与我们构造的最大的k个数据相同。这里只是简单的通过少量数据进行试验,当然我们在实际情况中遇到的数据量会更大。但是,利用堆的思想来做可以让我们快速找出topK。

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

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

相关文章

Find My产品|Ember发布支持苹果Find My温控马克杯

在 CES2023 展会上&#xff0c;温控马克杯制造商 Ember 表示&#xff0c;计划在 2023 年 Q2 上市一款支持苹果 Find My 应用的全新 Travel Mug 2 马克杯。 这项新功能将使用户能够在 Find My 应用中追踪 Travel Mug 2 的位置&#xff0c;就像追踪iPhone、iPad、AirPods 或其他…

埃科光电在科创板IPO过会:拟募资11亿元,董宁为实际控制人

近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;合肥埃科光电科技股份有限公司&#xff08;下称“埃科光电”获得科创板上市委会议通过。据贝多财经了解&#xff0c;埃科光电于2022年6月22日在科创板提交招股书&#xff0c;并于12月29日递交招股书&#xff08;上会稿…

图像分割笔记

图像分割笔记 目标&#xff1a; 实现图像中多个物体的分割&#xff0c;多个物体的标注方式为0,1,2,3,0表示背景&#xff0c;1表示一种物体&#xff0c;2表示另一种物体&#xff0c;假设我们现在的分割任务里面有5个目标需要&#xff0c;如肺叶分割&#xff0c;5个肺叶的标注方…

飞书开放平台-全新消息卡片搭建工具

前言你还在为需要手撕 JSON 代码而烦恼吗&#xff1f;消息卡片搭建工具全新升级&#xff0c;为你带来更优雅的卡片创作体验&#xff1a;&#x1f31f; 卡片编辑&#xff1a;纯可视化操作编辑消息卡片&#xff0c;再也不用碰代码&#x1f31f; 我的卡片&#xff1a;一键保存卡片…

Vue3 Composition API

文章目录p15 Vue3 Composition APIMixin全局混入options API的弊端认识Componsition APIsetup函数的参数setup不可以使用thisReactive APIrefreadonlyp16 Composition API(二)toRefscomputedwatchEffect在setup中使用refwatchp15 Vue3 Composition API Mixin 全局混入 、 opti…

使用正则表达式删除注释

以下摘自某网友来信&#xff1a; 难点 Javascript 不支持点号匹配换行符, 因此无法直接进行多行匹配处理前面没有 http: 的 //, 当然要用否定前瞻( negative lookbehine)了:(?<!http:)\/\/. 可惜 javascript 不支持 思路 关于多行匹配 这个问题, 之前我已经说过, 要点…

多线程初阶(四)定时器及线程池

目录 前言&#xff1a; 定时器 使用标准库中定时器 模拟实现定时器 线程池 使用标准库中的线程池 代码实现 ThreadPoolExecutor类介绍 构造方法参数介绍 拒绝策略介绍 模拟实现线程池 代码实现 提出问题 小结&#xff1a; 前言&#xff1a; 这篇文章同上一篇文章…

简单实现Java定时器

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【JavaEE】 &#x1f432;&#x1f432;本篇内容&#xff1a;自己实现Java定时器 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&…

【手写 Vue2.x 源码】第九篇 - 对象数据变化的观测情况

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组深层观测的实现&#xff0c;核心几个点如下&#xff1a; 最初仅对数组类型进行了原型方法重写&#xff0c;并未进行递归处理&#xff0c;所以&#xff0c;当时仅实现了数组的单层劫持&#xff1b; 通过对数组进行 observe…

二、Gtk4-GtkApplication and GtkApplicationWindow

1 GtkApplication 1.1 GtkApplication and g_application_run 人们编写编程代码来开发应用程序。什么是应用程序?应用程序是使用库运行的软件&#xff0c;其中包括操作系统、框架等。在GTK 4编程中&#xff0c;GTK应用程序是使用GTK库运行的程序(或可执行程序)。 编写GtkAp…

信创改造,你了解多少?

最近&#xff0c;“信创”一词在IT圈瞬间爆火&#xff0c;那什么是信创&#xff1f;又能带来哪些突破性的改变&#xff1f;跟随佑友一起来详细了解一下… 信创的来源 2016年3月4日&#xff0c;24家专业从事软硬件关键技术研究及应用的国内单位&#xff0c;共同发起成立了一个非…

分布式链路追踪-skywalking入门体验

背景 旁友&#xff0c;你的线上服务是不是偶尔来个超时&#xff0c;或者突然抖动一下&#xff0c;造成用户一堆反馈投诉。然后你费了九牛二虎之力&#xff0c;查了一圈圈代码和日志才总算定位到问题原因了。或者公司内部有链路追踪系统&#xff0c;虽然可以很轻松地通过监控判…

deb dpkg fpm cpack debmake 打包

文章目录deb 简介hello debfpmpreinst postinst prerm postrmcmake cpackdebmakedeb 简介 deb: Linux发行版Debian系列(如Debian, Ubuntu等)的软件包格式, 没有自提取(Self-extracting), 不能直接运行, 需要借助dpkg等安装. Dpkg: Debian Package Manager, Debian包管理器, 中…

Python读取各种形式文件(excel,txt),python基本用法

读取excel,读取结果是dataframe形式。 excelFile ranalyze_search_category.xlsx df pd.DataFrame(pd.read_excel(excelFile)) print(df) 详情&#xff1a;(21条消息) 在Python中使用Pandas.DataFrame对Excel操作笔记一 - 从Excel里面获取说需要的信息_fengqiaoxian的博客-CS…

TensorFlow之模型保存与加载

模型在训练过程中或者在训练之后&#xff0c;模型的执行过程能被保存&#xff0c;也就是&#xff0c;模型能从暂停中恢复以免训练的时间过长。因此&#xff0c;被保存的模型可以被共享&#xff0c;其他人可以重新构建相同的模型。被保存的模型以如下的两种方式进行共享&#xf…

青训营——前端方向练习题(不定项选择题例题)

文章目录 &#x1f4c4;前言 PART1 PART2 PART3 PART4 PART5 PART6 PART7 PART8 PART9 &#x1f4c4;前言 一共有十八题&#xff0c;题目选项为不定项&#xff0c;有单选&#xff0c;也有多选。 PART1 选择题 1&#xff1a; 下列哪些是 HTML5 的新特性&#xff1f; A…

Android 深入系统完全讲解(3)

3 Zygote 虚拟机的流程&#xff0c;学习方法 说完了 init 的启动过程&#xff0c;我们来说说 Zygote 的启动过程。 这里我们看下整个的步骤&#xff0c;主要完成了&#xff1a; 1 startVM() 创建虚拟机 2 startReg() 注册 JNI 方法 3 preload()预加载通用类&#xff0c;这里主…

【信管7.1】质量与质量管理过程

质量与质量管理过程对于我们的项目管理理论相关的学习来说&#xff0c;质量是除了范围、进度、成本之外的另一个核心内容。还记得我们在学习敏捷的时候讲过的项目管理三角形吗&#xff1f;通过之前的课程&#xff0c;我们已经学完了它的三个支点。接下来&#xff0c;我们就要学…

播客丨关于年终总结,程序员有话说

绘声绘影绘声绘影是网易云信独家打造的一档聚焦行业热点、个人成长方面的播客栏目。栏目希望通过邀请不同背景、不同行业、不同阅历的企业研发、产品、运营等相关岗位负责人作为节目嘉宾&#xff0c;以自身职业视角交流行业洞见和发展前景&#xff1b;以过来人的视角分享在时代…

dfs、bfs搜索题型小结

一、全排列 &#xff08;1&#xff09;1199&#xff1a;全排列 原题链接 解析 &#xff08;2&#xff09;剪枝思想 满足等式关系的全排列——dfs剪枝 &#xff08;3&#xff09;P1088 [NOIP2004 普及组] 火星人 原题链接 解析 二、组合&#xff08;选与不选&#xff09;…