实现完全二叉树
文章目录
- 1、树概念及结构
- 2、孩子兄弟表示法
- 3、二叉树
- 3.1、二叉树的概念
- 3.2、特殊的二叉树
- 3.3、二叉树的存储
- 4、堆的性质
- 5、数组结构实现完全二叉树
- 1、结构体的定义
- 2、初始化堆
- 3、销毁堆
- 4、交换函数
- 5、向上调整函数
- 6、插入数据
- 7、向下调整函数
- 8、删除堆顶数据函数
- 9、判断是否空堆
- 10、计算堆大小函数
- 11、取堆顶元素函数
1、树概念及结构
1、和我们之前学习的顺序表、链表这样的线性顺序结构不同,树是一种非线性的数据结构
2、树是递归定义的,树由根和 N 棵子树(N>=0)构成。
3、树与非树的判断:子树是不相交的;每个节点有且仅有一个父节点;一棵拥有 N 个节点的数有 N-1 条边
4、节点的度:一个节点含有的子树的个数,称为该节点的度
5、叶节点或终端节点:度为 0 的节点称为叶节点
6、父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
7、子节点:一个节点含有子树的根节点称为该节点的子节点
8、兄弟节点:具有相同父节点的节点互称兄弟节点
9、树的度:一棵树中,最大的节点的度称为树的度
10、节点的层次:从根开始定义,根为第一层,根的子节点为第二层,以此类推
11、树的高度或深度:树中节点的最大层次
12、节点的祖先:从根到该节点所经分支上的所有节点
13、子孙:以某节点为根的子树中任一节点都称为该节点的子孙
14、森林:由m(m>0)棵互不相交的树的集合称为森林(并查集就会用到森林)
2、孩子兄弟表示法
//孩子兄弟表示法(最好的树结构)
typedef int DataType;struct TreeNode
{struct TreeNode* firstChild;//父亲指向第一个孩子struct TreeNode* pNextBrother;//剩下的孩子用孩子的兄弟指针链接起来DataType data;
};
3、二叉树
3.1、二叉树的概念
1、二叉树是度为 2 的树,即二叉树不存在度大于2的节点
2、二叉树的子树有左右之分,且次序不能颠倒,因此二叉树是有序数列
3、二叉树可以为空树
4、对任何一个非空二叉树,如果度为 0 叶节点个数为n0,度为2的分支节点个数为n2,则有n0 = n2+1 (即度为 0 的比度为 2 的节点永远多一个)
5、完全二叉树中度为 0 的节点只有 1个 或 0个
3.2、特殊的二叉树
1、满二叉树:一个二叉树,如果每层的节点数都达到最大值,则这个二叉树就是满二叉树,也就是说,如果一个二叉树的层数为K,且节点总数为2^k-1,它就是满二叉树
2、完全二叉树:完全二叉树是效率很高的数据结构,他的前K-1层都是满的,最后一层不满,但是最后一层从左往右是连续的
3、如果将完全二叉树的数据存储到数组中,会有以下三个公式来描述父节点与子节点的关系
- leftchild = parent * 2+1 (左孩子的下标等于父节点下标乘 2 加 1)
- rightchile = parent * 2+2(右孩子的下标等于父节点下标乘 2 加 2)
- parent = (child-1)/ 2 (无论是左孩子还是右孩子,都能用这个公式找到父亲)
3.3、二叉树的存储
1、数组存储:只适合存储 完全二叉树 和 满二叉树
2、链式存储:适合基本所有二叉树存储,但如果存储 完全二叉树 和 满二叉树 ,效率不如数组存储
4、堆的性质
1、大根堆:树中父亲节点的数据都大于等于孩子
2、小根堆:树中父亲节点的数据都小于等于孩子

(注:上图为小根堆,下图为大根堆)
5、数组结构实现完全二叉树
1、结构体的定义
typedef int HPDataType;
typedef struct Heap
{HPDataType* a;size_t size;size_t capacity;
}HP;
2、初始化堆
void HeapInit(HP* php)
{assert(php);//断言判空php->a = NULL;php->size = php->capacity = 0;
}
3、销毁堆
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}
4、交换函数
void Swap(HPDataType* pa, HPDataType* pb)
{HPDataType tmp = *pa;*pa = *pb;*pb = tmp;
}
5、向上调整函数
void AdjustUp(HPDataType* a,size_t child)//向上调整函数
{size_t parent = (child - 1) / 2;while (child>0)//如果child在数组中的位置大于0就继续{//if(a[child] > a[parent])//大堆if (a[child] < a[parent]) //小堆判断{Swap(&a[child], &a[parent]);//交换父节点和子节点中的数据child = parent;//交换完数据之后更新一下子节点的位置//将子节点的位置更新到原来的父节点上parent = (child - 1) / 2;}else{break; }
}
6、插入数据
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){size_t newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;//问号表达式判断容量,如果原容量为0就扩容到4,如果非零就扩大为原来的两倍HPDataType* tmp = realloc(php->a, sizeof(HPDataType) * newCapacity);if (tmp == NULL){printf("realloc failed\n");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;++php->size;//向上调整控制保持是一个小堆AdjustUp(php->a,php->size-1);//传数组和数组的最后一个数据//也就是二叉树中刚刚加入的孩子
}
}
7、向下调整函数
void AdjustDown(HPDataType* a,size_t size,size_t root)//向下调整函数
{size_t parent = root;size_t child = parent * 2 + 1;while (child < size)//用孩子在数组中的位置比较,如果还有孩子,就继续,没有就停止{//1、选出左右孩子中小的那个if (child+1<size && a[child + 1] < a[child])//因为不确定右孩子存不存在,直接访问有越界风险//所以需要加个child+1(也就是右孩子)小于size的判断条件{++child;}if (a[child] < a[parent])//2、孩子与父亲比较,孩子小于父亲{Swap(&a[child], &a[parent]);//3、孩子与父亲交换parent = child;//把孩子的位置给父亲child = parent * 2 + 1;//在把孩子位置置成下一个孩子}else//如果孩子大于父亲{break;}}
}
8、删除堆顶数据函数
void HeapPop(HP* php)//堆的删除
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);--php->size;AdjustDown(php->a,php->size,0);//向下调整
}
9、判断是否空堆
bool HeapEmpty(HP* php)
{//判断堆是不是空堆assert(php);return php->size == 0;
}
10、计算堆大小函数
size_t HeapSize(HP* php)
{assert(php);return php->size;
}
11、取堆顶元素函数
HPDataType HeapTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];
}
相关文章:
实现完全二叉树
文章目录1、树概念及结构2、孩子兄弟表示法3、二叉树3.1、二叉树的概念3.2、特殊的二叉树3.3、二叉树的存储4、堆的性质5、数组结构实现完全二叉树1、结构体的定义2、初始化堆3、销毁堆4、交换函数5、向上调整函数6、插入数据7、向下调整函数8、删除堆顶数据函数9、判断是否空堆…...
【独家】华为OD机试 - 矩阵最值(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本期题目:矩阵最值 题目 给定一个仅包…...
C++模板(进阶)
文章目录非类型模板参数类模板的特化类模板的概念函数模板特化类模板的特化全特化偏特化参数的进一步限制模板的分离编译模板的优缺点非类型模板参数 模板参数分类型形参与非类型形参. 类型形参: 出现在模板参数列表中,跟在class,typename之类的参数类型名称. 非类型形参: 就是…...
【数据分析之道(二)】列表
文章目录专栏导读1、列表介绍2、访问列表中的值3、列表增加和修改4、删除元素5、列表函数6、列表方法专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》,本专栏针…...
架构师必须要掌握的大小端问题
一、什么是大端和小端 所谓的大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 简单来说:大端——高尾端,小端——低尾端 举个例子,比如数字 0x12 34 56 78…...
2023年ACM竞赛班 2023.3.20题解
目录 瞎编乱造第一题 瞎编乱造第二题 瞎编乱造第三题 瞎编乱造第四题 瞎编乱造第五题 不是很想编了但还是得编的第六题 不是很想编了但还是得编的第七题 还差三道题就编完了的第八题 还差两道题就编完了的第九题 太好啦终于编完了 为啥一周六天早八阿 瞎编乱造第一题…...
什么是语法糖?Java中有哪些语法糖?
本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理1 语法糖语法糖(Syntactic Sugar&#…...
STM32学习(五)
GPIO General Purpose Input Output,通用输入输出端口,简称GPIO。 作用: 采集外部器件的信息(输入)控制外部器件的工作(输出) GPIO特点 1,不同型号,IO口数量可能不一样…...
STM32的CAN总线调试经验分享
相关文章 CAN总线简易入门教程 CAN总线显性电平和隐性电平详解 STM32的CAN总线调试经验分享 文章目录相关文章背景CAN总线CAN控制器CAN收发器调试过程硬件排查CAN分析仪芯片CAN控制器调试总结背景 最近负责的一个项目用的主控芯片是STM32F407IGT6,需要和几个电机控…...
深度剖析自定义类型(结构体、枚举、联合)——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是心心念念的结构体啦,其实在此之前,我也写过结构体的知识点,只是并没有很深入,那么,今天我会仔细来学习自定义类型的知识点,下面…...
《水经注地图服务》发布的全球影像数据在水经微图中调用
(本文首发于“水经注GIS”公号,订阅“水经注GIS”公号,为你分享更多GIS技术 )1、引言古人云:“工欲善其事,必先利其器。”意思是说:工匠想要使他的工作做好,一定要先让工具锋利&…...
MyBatis --- 缓存、逆向工程、分页插件
一、MyBatis的缓存 1.1、MyBatis的一级缓存 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问 使一级缓存失效的四种情况: 1、…...
vue3自定义svg图标组件
可参考: 未来必热:SVG Sprites技术介绍 懒人神器:svg-sprite-loader实现自己的Icon组件 在Vue3项目中使用svg-sprite-loader 前置知识 在页面中,虽然可以通过如下的方式使用img标签,来引入svg图标。但是,…...
智能火焰与烟雾检测系统(Python+YOLOv5深度学习模型+清新界面)
摘要:智能火焰与烟雾检测系统用于智能日常火灾检测报警,利用摄像头画面实时识别火焰与烟雾,另外支持图片、视频火焰检测并进行结果可视化。本文详细介绍基于智能火焰与烟雾检测系统,在介绍算法原理的同时,给出Python的…...
Java实习生------JUC并发编程(多线程)10道面试题打卡⭐⭐⭐
目录 并行和并发有什么区别? 线程和进程有什么区别? 创建线程有哪几种方式? runnable和callable有什么区别? 线程的状态及转换? sleep()和wait()的区别? run()和start()有什么区别? 在…...
ChatGPT和百度文心一言写用例,谁更强?
文心一言发布的第一时间,就排队申请了邀请码,昨晚看了下,邀请码已经到手,索性就拿一个例子试了一下,看看哪个能够真正意义上的提高生产力,最简单的录制了个GIF动画如下:问题:你是一个…...
设计模式总结
设计模式的六大原则 开放-封闭原则(OCP) (总原则) Open-Close Principle:该对扩展开放,对修改关闭。 目的就是保证程序的扩展性好,易于维护和升级。 开放-封闭原则是面向对象设计的核心所在, 开闭原则是Java世界里最基础的设计原则。 开闭…...
【K8S系列】深入解析Pod对象(一)
目录 序言 1.问题引入 1.1 问题描述 2 问题解答 2.1 pod 属性 2.1.1 NodeSelector 2.1.2 HostAliases 2.1.3 shareProcessNamespace 2.1.4 NodeName 2.1.5 其他pod属性 2.2 容器属性 2.2.1 ImagePullPolicy 2.2.2 Lifecycle 3 总结 4. 投票 序言 任何一件事情&am…...
JVM学习.02 内存分配和回收策略
1、前言《JVM学习.01 内存模型》篇讲述了JVM的内存布局,其中每个区域是作用,以及创建实例对象的时候内存区域的工作流程。上文还讲到了关于对象存货后,会被回收清理的过程。今天这里就着重讲一下对象实例是如何被清理回收的,以及清…...
logstash+elasticsearch+Kibana(ELK)日志收集
文章目录一.安装ELK 7.17二.为Elasticsearch设置密码三.配置logstash四.springboot整合logstash五.spring整合Elastic Search一.安装ELK 7.17 不要一股脑执行以下语句,请观察修改要修改的地方 安装logstash # logstash安装docker run -d --name logstash \-p 5043:5043 -p 5…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
