数据结构--二叉树和堆

目录

1.基本概念

2.树的遍历方法

3.满二叉树&&完全二叉树

4.逻辑结构&&物理结构

5.推理公式

6.二叉树应用--堆

7.简单实现堆


1.基本概念

(1)这个里面的概念还是比较多的,但是大部分我们只需要了解即可,因为这个我们在离散数学里面已经学习过一些理论知识,这个地方就不在进行这个详细的赘述了;

(2)重点就是知道这个叶子结点和终端节点,双亲节点,孩子节点,树的高度,树的高度是从1开始的,这个是和离散数学里面相互区别点一个点,重点记忆一下就行了;

(3)每一个树都是有很多的节点组成的,但是这个节点都有自己的分支,我们把一个节点的分支的个数叫做这个节点的度,其中所有节点里面的度数的最大值就是这个树的度;

2.树的遍历方法

(1)我们知道这个树肯定是有这个val表示这个节点的数值,但是这个具体要定义多少个指针,这个是不确定的,因为我们的这个树的节点的个数是不确定的;

(2)这个时候一个很厉害的定义方法就出来了,不是这个树里面的节点个数不确定吗,这个时候我们只需要定义两个节点,一个节点就是左边节点,一个节点就是右边节点;

(3)在实现这个数据结构的时候,我们只需要先定义一个指针指向这个左边的节点,让后通过一个循环,让这个节点指向他右边的兄弟节点,如果没有的话就会直接到下一个父节点,这个就可以实现这个树的遍历;

3.满二叉树&&完全二叉树

(1)满二叉树:每一个节点都有两个子节点,一个是左边的节点,一个是右边的节点;

(2)完全二叉树:上面的每一层都是满的,但是最后一层没有满,满二叉树就是特殊的完全二叉树,后面的大部分介绍对于这个满二叉树通常都是使用的完全二叉树;

4.逻辑结构&&物理结构

(1)我们之前学习这个链表就介绍过这个逻辑结构和物理结构,这个逻辑结构就是这个我们自己想的图,例如这个脸表里面不同的节点之间使用一个有方向的箭头相互连接,实际上真实存在的这个链表之间通过指针就会直接找到下一个节点了,这个箭头就是我们认为的构想出来的,实际上就是不存在的;

(2)在二叉树里面,我们的这个完全二叉树(实际上是满二叉树)也是我们认为臆想出来的,在真实存储的时候,这个是使用数组的方式进行存储的;

(3)对于一个数组的序列,我们也是可以快速地画出它的逻辑结构的,直接按照这个父子节点的顺序排列即可;

5.推理公式

(1)通过一个数组,我们可以画出对应的逻辑结构,我们接下俩就是想要得到通过这个父节点的下标,找到这个子节点的下标,通过子节点的下边,推理出来这个父节点的下标;

(2)已知这个父节点下标i,左子树就是i*2+1,右子树就是i*2+2,已知这个子树的下标j,这个时候他的父亲节点的下标就是(j-1)/2因为这个进行的除法运算,这个时候即使两个子节点对应同一个父亲节点,这个也是可以计算出来的;

(3)我们上面介绍的这个满二叉树的逻辑结构就是一个数组,但是对于一个完全二叉树(非满二叉树),如果还是使用数组进行表示,这个时候就会造成这个空间的浪费,因为这个,满二叉树和完全二叉树都是有顺序的,我们对于这个完全二叉树里面没有节点的位置,就相当于是浪费一个数组的空间,因为这个地方如果放数据,我们上面的这个父子节点下标的推理公式就不成立了;

6.二叉树应用--堆

(1)这里的堆是一种数据结构,和我们之前在C语言里面说的malloc在对堆上面开辟空间的“堆”虽然写法是一样的,但是真正的意义是不一样的,malloc是操作系统里阿米的一个区域,我们在这个区域上面开辟内存空间,和这里的数据结构对截然不同,我们在数据结构里面学习的堆是用来排序的,是一种算法;

(2)堆的分类:大堆和小堆,这个定义是根据这个子节点和父亲节点val值的大小确定的,当一个二叉树里面的任何一个父亲节点的数值都大于这个子节点的,我们就称之为一个大堆,反之就是一个小堆;

(3)通过观察我们不难发现,小堆根是最小的,大堆的根是最大的,这个就可以找到一组数据里面的极值,后续我们回去学习这个如何把一个不是堆序列的数据经过这个顺序的变换使之成为这个大堆或者小堆,或者说是这个本来开始就是一个堆序列,经过数据的添加删除之后,他依然还是一个堆序列;

(3)堆的实质就是一个完全二叉树,这个就是堆和二叉树的联系;

7.简单实现堆

(1)头文件

typedef int HPDataType;typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;void Swap(HPDataType* p1, HPDataType* p2);
void AdjustUp(HPDataType* a, int child);
void AdjustDown(HPDataType* a, int n, int parent);void HPInit(HP* php);
void HPDestroy(HP* php);
void HPPush(HP* php, HPDataType x);

这个里面包括这个数组的初始化,销毁,数据的插入,向上调整,向下调整;

(2)对一个简单的对堆,实际上就是一个数组,只不过结构上面更加体系化,我们想要插入数据,如果这个数据插入之后,原来的小堆还是小堆,这个直接插入即可,但是如果不是,我们就需要调整,因为这个小堆的父节点的值小,说明我们这个时候插入的数据比这个父节点还小,我们就需要要向上调整,把这个插入的节点和祖先节点进行比较,直到满足这个小堆的定义才停止;

因为我们插入的数据更加小,这个函数实现的就是向上调整;

void AdjustUp(HPDataType* a, int child)
{// 初始条件// 中间过程// 结束条件int parent = (child - 1) / 2;//while (parent >= 0)while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

(3)如果我们想要实现堆的删除,这个地方的删除不是删除最后一个节点,这样的话直接size--即可,完全没有其他必要了,我们要删除的是这个堆顶部元素节点;

删除的方法就是把这个堆的顶部节点和这个最后一个节点互换,我们再size--把这个节点删除,这个时候堆的顶部节点删除了,但是这个时候肯定是不满足堆的定义的,因为我们把这个堆顶元素换掉了啊,我们这个时候就需要把这个节点向下进行查找,直到符合这个堆的定义才停止;仔细观察我们会发现,这个实际上就是一个简单的排序了,但是这个还不是真正的堆排序,但是前期阶段我们可以这样进行理解;

下面是这个向下调整的实现代码:

void AdjustDown(HPDataType* a, int n, int parent)
{// 先假设左孩子小int child = parent * 2 + 1;while (child < n)  // child >= n说明孩子不存在,调整到叶子了{// 找出小的那个孩子if (child + 1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

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

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

相关文章

论文略读:Large Language Models Relearn Removed Concepts

通过神经元修剪在模型编辑方面取得的进展为从大型语言模型中去除不良概念提供了希望。 然而&#xff0c;目前尚不清楚在编辑后模型是否具有重新学习修剪概念的能力——>论文通过在重新训练期间跟踪修剪神经元中的概念显著性和相似性来评估模型中的概念重新学习 研究结果表明…

嵌入式C语言面试相关知识——内存管理(不定期更新)

嵌入式C语言面试相关知识——内存管理&#xff08;不定期更新&#xff09; 一、博客声明二、自问题目1、嵌入式系统的内存布局是怎么样的&#xff1f;2、动态内存分配在嵌入式系统中的使用有什么注意事项&#xff1f;3、什么是内存碎片&#xff0c;如何减少内存碎片&#xff1f…

论文复现-基于决策树算法构建银行贷款审批预测模型(金融风控场景)

作者Toby&#xff0c;来源公众号&#xff1a;Python风控模型&#xff0c;基于决策树算法构建银行贷款审批预测模型 目录 1.金融风控论文复现 2.项目背景介绍 3.决策树介绍 4.数据集介绍 5.合规风险提醒 6.技术工具 7.实验过程 7.1导入数据 7.2数据预处理 7.3数据可…

Linux muduo 网络库

主要记录示意图和知识点框架&#xff1a; 1、阻塞、非阻塞、同步、异步 在处理IO的时候&#xff0c;阻塞和非阻塞都是同步IO&#xff0c;只有使用了特殊的API才是异步IO。 2、五种IO模型&#xff1a; 阻塞、非阻塞、IO复用、信号驱动、异步IO 3、muduo网络库 muduo网络库给用…

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件&#xff0c;如果这些基础模块每个项目都实现一套&#xff0c;维护起来那真的头大&#xff0c;你说呢&#x1f609; 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子&#xff1a; myLib ├…

哈希表——C语言

哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;能够在平均情况下实现常数时间的查找、插入和删除操作。 哈希表的核心是哈希函数&#xff0c;哈希函数是一个将输入数据&#xff08;通常称为“键”或“key”&#xff09;转换为固定长度的整数的函数…

python操作SQLite3数据库进行增删改查

python操作SQLite3数据库进行增删改查 1、创建SQLite3数据库 可以通过Navicat图形化软件来创建: 2、创建表 利用Navicat图形化软件来创建: 存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型: NULL. 值是空值。 INTEGER. 值是有符…

刷爆leetcode第十期

题目一 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 首先我们要来判断下它们的根是否相等 根相等的话是否它们的左子树相等 是否…

06.C2W1.Auto-correct

往期文章请点这里 目录 OverviewAutocorrectWhat is autocorrect?How it works Building the modelMinimum edit distanceMinimum edit distance algorithmMinimum edit distance Part 2Minimum edit distance Part 3 往期文章请点 这里 Overview 本周学习目标&#xff1a;…

Spring源码十七:Bean实例化入口探索

上一篇Spring源码十六&#xff1a;Bean名称转化我们讨论doGetBean的第一个方法transformedBeanName方法&#xff0c;了解Spring是如何处理特殊的beanName&#xff08;带&符号前缀&#xff09;与Spring的别名机制。今天我们继续往方法下面看&#xff1a; doGetBean 这个方法…

CDNOW_master.txt数据分析实战

一、数据详情 该数据集是常见的销售数据集&#xff0c;数据展示的是美国1997后的商品销售数据。包含四个字段&#xff0c;分别是用户id,购买时间&#xff0c;销售量&#xff0c;与销售金额。 二、数据读取与数据清洗 导入必要的包 \s代表的许多空格作为分割&#xff0c;names重…

实现antd designable平台的组件拖拽功能

平台&#xff1a;designable设计器 github&#xff1a;designable 目录 1 背景2 技术栈3 组件拖拽和放置3.1 类型定义3.2 拖拽3.3 放置 1 背景 由于业务需求&#xff0c;我们需要实现designable平台的一个简易版的组件拖拽功能。 #mermaid-svg-QrxSDGe9YyGG3LbQ {font-family:…

CSS学习(三大特性 盒子模型)

目录 Emmet语法 1.快速生成HTML结构语法 2.快速生成CSS样式语法 CSS的复合选择器 后代选择器 子选择器 并集选择器 伪类选择器 链接伪类选择器 focus伪类选择器 CSS的三大特性 层叠性 继承性 优先级 CSS盒子模型 组成 边框 边框 内边距 外边距 块级盒子水…

GESP C++一级真题

PDF图片1-7 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回&#x1f64f;&#x1f64f;&#x1f64f;

用ThreadLocal解决线程隔离问题

存在的以下代码所示的线程隔离问题&#xff1a; package study.用ThreadLocal解决线程隔离问题;/*线程隔离 - 在多线程并发场景下&#xff0c;每个线程的变量都应该是相互独立的线程A&#xff1a;设置&#xff08;变量1&#xff09; 获取&#xff08;变量1&#xff09;线程B&a…

Agilent 安捷伦 DSO91304A 高性能示波器

Agilent 安捷伦 DSO91304A 高性能示波器 DSO91304A Infiniium 高性能示波器&#xff1a;13 GHz 13 GHz4个模拟通道高达 1 Gpts 存储器和 40 GSa/s 采样率可以提供更完整的信号迹线捕获更低的本底噪声&#xff08;50 mV/格时为 1.73 mVrms&#xff09;和深入的抖动分析功能能够…

我国网络安全领域有哪些法律法规?主要内容是什么?

1. 背景介绍 网络信息安全方面的法规在全球范围内都有相应的立法&#xff0c;我们主要的立法有《网络安全法》、《密码法》、《数据安全法》以及《个人信息保护法》。当前也有一些相关的条例和管理办法&#xff0c;接下来就为大家一一介绍。 2. 法规介绍 在中国&#xff0c;…

Error in onLoad hook: “SyntaxError: Unexpected token u in JSON at position 0“

1.接收页面报错 Error in onLoad hook: "SyntaxError: Unexpected token u in JSON at position 0" Unexpected token u in JSON at position 0 at JSON.parse (<anonymous>) 2.发送页面 &#xff0c;JSON.stringify(item) &#xff0c;将对象转换为 JSO…

《昇思25天学习打卡营第14天|onereal》

第14天学习内容如下&#xff1a; Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c…

跨越界限的温柔坚守

跨越界限的温柔坚守 —— 郑乃馨与男友的甜蜜抉择在这个光怪陆离、瞬息万变的娱乐圈里&#xff0c;每一段恋情像是夜空中划过的流星&#xff0c;璀璨短暂。然而&#xff0c;当“郑乃馨与男友甜蜜约会”的消息再次跃入公众视野&#xff0c;它不仅仅是一段简单的爱情故事&#xf…