数据结构:Heap(二叉树)的基本操作

news2025/6/20 14:11:22

目录

1.有关二叉树必须知道的几个基本概念

2.有关二叉树的基本操作

2.0有关元素的定义以及要进行的操作

2.1初始化和销毁操作

2.2插入操作以及上调操作

2.2.1插入操作以及上调操作的图解

2.2.2插入操作以及上调操作的代码

2.3删除根元素及其下调操作

2.3.2删除根元素及其下调操作的代码


1.有关二叉树必须知道的几个基本概念

完全二叉树:前n-1层满,最后一层未必满,但自左向右是连续的

满二叉树:相较于完全二叉树,最后一层叶子是完全的

经实验可知,数组是实现叉树这种数据结构的最好方式

由图可知

算孩子公式 leftchild= 2parent +1   rightchild=2parent+2

算父亲公式 parent=(child-1)/2

2.有关二叉树的基本操作

2.0有关元素的定义以及要进行的操作

typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;
	int size;
	int capacity;
}HP;

void HPInit(HP* php);
void HPDestroy(HP*php);

void HPPush(HP* php, HPDataType x);//插入操作
void Swap(HPDataType* px, HPDataType* py);
void AdjustUp(HPDataType* a, int child);//上调操作

void HPPop(HP* php);//删除根操作
void AdjustDown(HPDataType* a, int n, int parent);//下调操作

bool HPEmpty(HP* php);

2.1初始化和销毁操作

void HPInit(HP* php)
{
	assert(php);
	php->a = NULL;
	php->size = 0;
	php->capacity = 0;
}

void HPDestroy(HP* php)
{
	assert(php);
	free(php);
	php->a = NULL;
	php->capacity = 0;
	php->size = 0;
}

2.2插入操作以及上调操作

2.2.1插入操作以及上调操作的图解

2.2.2插入操作以及上调操作的代码

void HPPush(HP* php, HPDataType x)//入
{
	assert(php);
	if (php->size = php->capacity)
	{
		size_t newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;
		HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
		}
		php->a = tmp;
		php->capacity = newcapacity;
	}
	php->a[php->size] = x;
	php->size++;//开辟空间并且插入到最后一个树叶
	AdjustUp(php->a, php->size-1);//将此被插入元素向上调整至合适位置
}

void AdjustUp(HPDataType* a, int child)//将size-1传递给child,让child的初始指向被插入的新元素
{
	int parent = (child - 1) / 2;
	while (child>0)//一旦这个被插入元素到了根部(child=0),停止!
	{
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			child = parent;//将child移动到parent的位置
			parent = (parent - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

void Swap(HPDataType* px, HPDataType* py)
{
	HPDataType temp;
	 temp = *px;
	*px = *py;
	*py = temp;
}

2.3删除根元素及其下调操作

2.3.1删除根元素及其下调操作的图解

2.3.2删除根元素及其下调操作的代码

void HPPop(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);
}

//向下调整,就是将新的根元素下移至它的合适的位置
void AdjustDown(HPDataType* a, int n, int parent)
{
	int child = (2 * parent) + 1;
	while (child<n)//n=size
	{
		if (a[child] > a[child + 1])//找小孩子,和小孩子交换,
		{//让最小的孩子成为新根才能保持小堆形态
			child++;//如果左孩子不是小,那么右才是小
		}
		if(a[child]<a[parent])//如果小孩子比父小,那么不符合小堆,需要交换
		{
			Swap(&a[parent], &a[child]);
			parent = child;//更新父下标指向
			child = (2 * parent) + 1;//更新孩子下标指向
		}
		else
		{
			break;
		}
	}
}

3.研究笔记

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

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

相关文章

基于Java的社区买菜系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1.2 菜品分类模块2.1.3 菜品档案模块2.1.4 菜品订单模块2.1.5 菜品收藏模块2.1.6 收货地址模块 2.2 可行性分析2.3 用例分析2.4 实体类设计2.4.1 菜品分类模块2.4.2 菜品档案模块2.4.3…

Solidity攻击合约:重入攻击与危害分析

以太坊智能合约开发中&#xff0c;重入攻击是一种常见的安全漏洞。这种攻击通常发生在合约的递归调用中&#xff0c;攻击者通过构造恶意交易&#xff0c;使得原本合约在执行过程中不断调用自身或其他合约&#xff0c;从而耗尽合约的Gas&#xff08;交易费用&#xff09;&#x…

基于java ssm springboot女士电商平台系统

基于java ssm springboot女士电商平台系统源码文档设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数&#xff0c;例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数&#xff0c;在小程序端的时候测试并无问题&#xff0c;但是发行到H5时首页加载会造成参数获取…

Nginx实现高并发

注&#xff1a;文章是4年前在自己网站上写的&#xff0c;迁移过来了。现在看我之前写的这篇文章&#xff0c;描述得不是特别详细&#xff0c;但描述了Nginx的整体架构思想。如果对Nginx玩得透得或者想了解深入的&#xff0c;可以在网上找找其他的文章。 ......................…

练习ROS动作编程

ROS学习记录&#xff1a;动作编程 引言&#xff1a; ​ 通过本实验&#xff0c;我们将联系我们学过的动作编程&#xff0c;客户端发送一个运动目标,模拟小乌龟运动到目标位置的过程,包含服务端和客户端的代码实现&#xff0c;并且带有实时的位置反馈。 希望你在本次学习过后&am…

html--心花怒放

代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Canvas 绘制一个❤</title><link rel"shortcut icon" href"../../assets/images/icon/favicon.ico" type"ima…

Edge好用的插件

目录 浏览器下载插件 插件推荐 AdGuard 广告拦截器 功能介绍 Global Speed: 视频速度控制 功能介绍 iTab新标签页(免费ChatGPT) 功能介绍 篡改猴&#xff08;强大的浏览器插件&#xff09; 功能介绍 浏览器下载插件 点击浏览器右上角的三个点&#xff0c;选择扩展 …

LeetCode 173.二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

C# 视频转图片

在 C# 中将视频转换为图像可以使用 FFmpeg 库。下面是一个示例代码来完成这个任务&#xff1a; using System; using System.Diagnostics;class Program {static void Main(string[] args){string inputFile "input_video.mp4"; // 输入的视频文件路径string outpu…

App前端开发跨平台框架比较:React Native、Flutter、Xamarin等

引言 移动应用开发领域的跨平台框架正在不断演进&#xff0c;为开发者提供更多选择。在本文中&#xff0c;我们将比较几个流行的跨平台框架&#xff1a;React Native、Flutter和Xamarin等。讨论它们的优缺点、适用场景以及开发体验。 第一部分 React Native: 优缺点、适用场景…

【C++ 学习】构造函数详解!!!

1. 类的6个默认成员函数的引入 ① 如果一个类中什么成员都没有&#xff0c;简称为空类。 ② 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 ③ 默认成员函数&#xff1a;用户没有显式实现&…

理解JavaScript中的WeakSet和WeakMap

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Python】科研代码学习:五 Data Collator,Datasets

【Python】科研代码学习&#xff1a;五 Data Collator&#xff0c;Datasets Data CollatorDefault data collatorDefaultDataCollatorDataCollatorWithPaddingPadding 其他 Data Collator Datasetsload_dataset其他一些基本操作 Data Collator HF官网API&#xff1a;Data Coll…

网易再战腾讯,《永劫无间》宣发捡大漏

《王者荣耀》代言人唯爱《永劫无间》&#xff1f; 最近时代少年团成员严浩翔疑似打赏《永劫无间》女主播一事&#xff0c;在饭圈和游戏圈引起了轩然大波&#xff0c;“男偶像打赏女主播”和“《王者荣耀》代言人爱玩《永劫无间》”&#xff0c;一时不知道哪个行为更炸裂。 虽…

力扣hot100题解(python版63-68题)

63、搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输…

Android Studio下载gradle超时问题解决

方法一 1. 配置根目录的setting.gradle.kts文件 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urluri ("https://maven.aliyun.com/repos…

结构体内存对齐详解

目录 结构体对齐&#xff1a; 为什么要进行内存对齐&#xff1f; 关于结构体的详解文章&#xff1a;C语言结构体详解_结构体变量和结构体类型举例-CSDN博客 结构体对齐&#xff1a; 存储的时候和当前存储的成员类型字节大小和默认对齐数比较&#xff0c;取小值 存在该对齐数的…

Windows11安装FFmpeg最新版本

打开终端: 输入 winget install ffmpeg 然后输入 Y 回车后出现如下图: 正在下载FFmpeg 6.1 安装成功 测试

cocos creator 3.7.2使用shader实现图片扫光特效

简介 功能&#xff1a;图片实现扫光效果 引擎&#xff1a;cocos Creator 3.7.2 开发语言&#xff1a;ts 完整版链接 链接https://lengmo714.top/284d90f4.html 效果图 shader代码 // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd. CCEffect %{techniques:- pas…