当前位置: 首页 > news >正文

实现完全二叉树

文章目录

  • 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、如果将完全二叉树的数据存储到数组中,会有以下三个公式来描述父节点与子节点的关系

  1. leftchild = parent * 2+1 (左孩子的下标等于父节点下标乘 2 加 1)
  2. rightchile = parent * 2+2(右孩子的下标等于父节点下标乘 2 加 2)
  3. 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、列表方法专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》&#xff0c;本专栏针…...

架构师必须要掌握的大小端问题

一、什么是大端和小端 所谓的大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 简单来说:大端——高尾端,小端——低尾端 举个例子,比如数字 0x12 34 56 78…...

2023年ACM竞赛班 2023.3.20题解

目录 瞎编乱造第一题 瞎编乱造第二题 瞎编乱造第三题 瞎编乱造第四题 瞎编乱造第五题 不是很想编了但还是得编的第六题 不是很想编了但还是得编的第七题 还差三道题就编完了的第八题 还差两道题就编完了的第九题 太好啦终于编完了 为啥一周六天早八阿 瞎编乱造第一题…...

什么是语法糖?Java中有哪些语法糖?

本文从 Java 编译原理角度&#xff0c;深入字节码及 class 文件&#xff0c;抽丝剥茧&#xff0c;了解 Java 中的语法糖原理及用法&#xff0c;帮助大家在学会如何使用 Java 语法糖的同时&#xff0c;了解这些语法糖背后的原理1 语法糖语法糖&#xff08;Syntactic Sugar&#…...

STM32学习(五)

GPIO General Purpose Input Output&#xff0c;通用输入输出端口&#xff0c;简称GPIO。 作用&#xff1a; 采集外部器件的信息&#xff08;输入&#xff09;控制外部器件的工作&#xff08;输出&#xff09; GPIO特点 1&#xff0c;不同型号&#xff0c;IO口数量可能不一样…...

STM32的CAN总线调试经验分享

相关文章 CAN总线简易入门教程 CAN总线显性电平和隐性电平详解 STM32的CAN总线调试经验分享 文章目录相关文章背景CAN总线CAN控制器CAN收发器调试过程硬件排查CAN分析仪芯片CAN控制器调试总结背景 最近负责的一个项目用的主控芯片是STM32F407IGT6&#xff0c;需要和几个电机控…...

深度剖析自定义类型(结构体、枚举、联合)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是心心念念的结构体啦&#xff0c;其实在此之前&#xff0c;我也写过结构体的知识点&#xff0c;只是并没有很深入&#xff0c;那么&#xff0c;今天我会仔细来学习自定义类型的知识点&#xff0c;下面&#xf…...

《水经注地图服务》发布的全球影像数据在水经微图中调用

&#xff08;本文首发于“水经注GIS”公号&#xff0c;订阅“水经注GIS”公号&#xff0c;为你分享更多GIS技术 &#xff09;1、引言古人云&#xff1a;“工欲善其事&#xff0c;必先利其器。”意思是说&#xff1a;工匠想要使他的工作做好&#xff0c;一定要先让工具锋利&…...

MyBatis --- 缓存、逆向工程、分页插件

一、MyBatis的缓存 1.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession查询的数据会被缓存&#xff0c;下次查询相同的数据&#xff0c;就会从缓存中直接获取&#xff0c;不会从数据库重新访问 使一级缓存失效的四种情况&#xff1a; 1、…...

vue3自定义svg图标组件

可参考&#xff1a; 未来必热&#xff1a;SVG Sprites技术介绍 懒人神器&#xff1a;svg-sprite-loader实现自己的Icon组件 在Vue3项目中使用svg-sprite-loader 前置知识 在页面中&#xff0c;虽然可以通过如下的方式使用img标签&#xff0c;来引入svg图标。但是&#xff0c;…...

智能火焰与烟雾检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;智能火焰与烟雾检测系统用于智能日常火灾检测报警&#xff0c;利用摄像头画面实时识别火焰与烟雾&#xff0c;另外支持图片、视频火焰检测并进行结果可视化。本文详细介绍基于智能火焰与烟雾检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的…...

Java实习生------JUC并发编程(多线程)10道面试题打卡⭐⭐⭐

目录 并行和并发有什么区别&#xff1f; 线程和进程有什么区别&#xff1f; 创建线程有哪几种方式&#xff1f; runnable和callable有什么区别&#xff1f; 线程的状态及转换&#xff1f; sleep()和wait()的区别&#xff1f; run()和start()有什么区别&#xff1f; 在…...

ChatGPT和百度文心一言写用例,谁更强?

文心一言发布的第一时间&#xff0c;就排队申请了邀请码&#xff0c;昨晚看了下&#xff0c;邀请码已经到手&#xff0c;索性就拿一个例子试了一下&#xff0c;看看哪个能够真正意义上的提高生产力&#xff0c;最简单的录制了个GIF动画如下&#xff1a;问题&#xff1a;你是一个…...

设计模式总结

设计模式的六大原则 开放-封闭原则(OCP) (总原则) Open-Close Principle&#xff1a;该对扩展开放&#xff0c;对修改关闭。 目的就是保证程序的扩展性好&#xff0c;易于维护和升级。 开放-封闭原则是面向对象设计的核心所在, 开闭原则是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的内存布局&#xff0c;其中每个区域是作用&#xff0c;以及创建实例对象的时候内存区域的工作流程。上文还讲到了关于对象存货后&#xff0c;会被回收清理的过程。今天这里就着重讲一下对象实例是如何被清理回收的&#xff0c;以及清…...

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…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...