【C语言】【数据结构】【手搓二叉树】用数组实现一个二叉树

2023-12-05

这里用数组(顺序表)实现一个二叉树

Heap.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;
	int size;
	int capacity;
}HP;
void HPInit(HP* php);
void HPDestory(HP* php);
void Swap(HPDataType* p1, HPDataType* p2);
void AdjustUp(HP* php, int child);
void AdjustDown(HP* php);
void HPPush(HP* php, HPDataType x);
void HPPop(HP* php);
HPDataType HPTop(HP* php);
int HPSize(HP* php);
bool ISEmpty(HP* php);

Heap.c

#include"Heap.h"
void HPInit(HP* php)
{
	assert(php);
	php->a = NULL;
	php->size = php->capacity = 0;
}
void HPDestory(HP* php)
{
	assert(php);
	free(php->a);
	php->a = NULL;
	php->size = php->capacity = 0;
}
//交换函数:
void Swap(HPDataType* p1, HPDataType* p2)
{
	HPDataType tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
//向上调整元素:(小堆)
void AdjustUp(HP* php,int child)
{
	assert(php);
	assert(php->size);
	int parent = (child - 1) / 2;
	while (child != parent)
	{
		if (php->a[child] < php->a[parent])
		{
			Swap(&php->a[child], &php->a[parent]);
			parent = child;
			parent = (child - 1) / 2;
		}
		else
			break;
	}
}
//向下调整:(小堆)
void AdjustDown(HP* php)
{
	assert(php);
	int parent = 0;
	int child = 2 * parent + 1;
	while (child<php->size)
	{
		if (child+1<php->size&&php->a[child] > php->a[child + 1])
			child = child + 1;
		if (php->a[parent] > php->a[child])
		{
			Swap(&php->a[parent], &php->a[child]);
			parent = child;
			child = 2 * child + 1;
		}
		else
			break;
	}
}
//插入元素:
void HPPush(HP* php, HPDataType x)
{
	int newcapacity = (php->capacity == 0) ? 4 : php->capacity * 2;
	if (php->capacity == php->size)
	{
		HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);
		php->a = tmp;
	}
	php->a[php->size] = x;
	php->size++;
	AdjustUp(php, php->size - 1);
}
//删除堆顶元素:
void HPPop(HP* php)
{
	assert(php);
	assert(php->size);
	Swap(&php->a[php->size - 1], &php->a[0]);
	php->size--;
	AdjustDown(php);
}
//取出栈顶元素:
HPDataType HPTop(HP* php)
{
	assert(php);
	assert(php->size);
	return php->a[0];
}
//计算元素个数:
int HPSize(HP* php)
{
	assert(php);
	assert(php->size);
	return php->size;
}
//判断堆是否为空:
bool ISEmpty(HP* php)
{
	assert(php);
	return php->size == 0;
}

test.c

#include"Heap.h"
int main()
{
	int arr[10] = { 5,9,1,3,7,6 };
	HP hp;
	HPInit(&hp);
	int sz = sizeof(arr) / sizeof(int);
	for (int i = 0;i <6;i++)
	{
		HPPush(&hp, arr[i]);
	}
	while (!ISEmpty(&hp))
	{
		int k = HPTop(&hp);
		printf("%d ", k);
		HPPop(&hp);
	}
	printf("\n");
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】【数据结构】【手搓二叉树】用数组实现一个二叉树 的相关文章

随机推荐

  • 企业计算机服务器中了Mallox勒索病毒如何解密,Mallox勒索病毒数据恢复

    随着计算机技术的不断应用与发展 网络为企业的生产运营提供了极大帮助 越来越多的企业开始利用网络办公 因此 随之而来的网络安全威胁也在不断增加 近期 云天数据恢复中心陆续接到很多企业的求助 企业的计算机服务器遭到了Mallox勒索病毒攻击 导
  • 深度学习中的梯度下降算法优化策略研究

    深度学习作为一种强大的机器学习技术 已经在各个领域取得了巨大的成功 而在深度学习的训练过程中 梯度下降算法是最常用的优化方法之一 然而 传统的梯度下降算法在处理深度神经网络时存在一些问题 如收敛速度慢 易陷入局部最优等 为了克服这些问题 研
  • 计算机图形图像技术(OpenGL多视口、三维场景的真实感绘制与真实感图形)

    一 实验原理 1 视口 1 定义 视口是程序窗口中的一个矩形绘图区 如下图所示 在屏幕上打开一个窗口时 自动把视口设置为整个程序窗口的大小 可以定义一个比程序窗口小的视口 也可以在一个程序窗口中定义多个视口 达到分屏显示的目的 2 函数说明
  • 企业计算机服务器locked1勒索病毒数据恢复,locked1勒索病毒解密流程

    随着计算机技术的不断发展 越来越多的企业走向数字化办公时代 计算机技术为企业的生产运营提供了有利条件 但也为企业带来了网络安全威胁 在本月 云天数据恢复中心陆续接到很多企业的求助 企业的速达办公软件遭到了locked1勒索病毒攻击 导致企业
  • 自监督音频学习在音频场景理解中的潜力与挑战

    自监督音频学习是一种无监督学习的方法 通过利用音频数据本身的特征进行学习 而无需依赖于人工标注的标签 近年来 自监督音频学习在音频场景理解方面展现出了巨大的潜力 它可以帮助计算机更好地理解音频的内容和情感 从而在语音识别 音乐推荐 声音事件
  • 锁表的原因及解决办法

    引言 作为开发人员 我们经常会和数据库打交道 当我们对数据库进行修改操作的时候 例如添加字段 更新记录等 没有正确评估该表在这一时刻的使用频率 直接进行修改 致使修改操作长时间无法响应 造成锁表 在 mysql 中 如果出现 alter 操
  • Anaconda【我的入门困惑】

    为什么需要安装Anaconda 方便地安装和管理Python及其相关包 Anaconda提供了一个 统一的管理界面 用户可以方便地查看和安装需要的Python版本和相关包 同时 它还提供了一个 虚拟环境 可以帮助用户使不同的项目隔离开来 从
  • 如何做好软文营销?媒介盒子为你解答

    信息爆炸的时代下企业如何抓住用户注意力提高自己的市场竞争力呢 答案是 软文营销 软文营销指通过将产品 品牌或服务以一种柔和的方式进行宣传 简单来说就是创作用户感兴趣的内容来吸引目标用户从而实现营销目的 那么如何做好软文营销呢 接下来就让媒介
  • 【元胞自动机】元胞自动机求解城市小区开放对周边道路通行影响研究【含Matlab源码 233期】

    博主简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 Matlab项目合作可私信 个人主页 海神之光 代码获取方式 海神之光Matlab王者学习之路 代码获取方式 座右铭 行百里者 半于九十 更多Matlab仿真内容点击 Matl
  • 金额到底应该用什么类型存储?

    在软件开发中 处理金额是一项常见而又至关重要的任务 一般情况下 对于那些不需要准确计算精度的数字 我们可以直接使用Float和Double处理 但是浮点数会将数据精度丢失 所以必须要选择合适的数据类型存储金额 背景 处理金额涉及到财务交易
  • 图片编辑用什么软件?我推荐这几款

    大家是不是会觉得 自己与专业的摄影博主之间好像有 壁 明明大家用的都是一样的拍摄设备 拍的也是相同地方的景色 但自己拍出来的照片效果 对比博主PO出来的图 总觉得少了点什么 这其中的原因有很多 有可能是我们的拍摄参数没调好 也可能是拍摄角度
  • redis性能测试

    redis性能测试 redis提供了一个性能测试工具redis benchmark 可以使用redis benchmark命令来了解redis的性能 redis benchmark q c 50 q 表示简化输出结果 c 50 表示有五十个
  • 【元胞自动机】元胞自动机传染病传播模拟【含Matlab源码 2780期】

    博主简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 Matlab项目合作可私信 个人主页 海神之光 代码获取方式 海神之光Matlab王者学习之路 代码获取方式 座右铭 行百里者 半于九十 更多Matlab仿真内容点击 Matl
  • 【元胞自动机】元胞自动机四车道交通流【含Matlab源码 039期】

    博主简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 Matlab项目合作可私信 个人主页 海神之光 代码获取方式 海神之光Matlab王者学习之路 代码获取方式 座右铭 行百里者 半于九十 更多Matlab仿真内容点击 Matl
  • 计算机毕业设计选题-十套优质毕设项目分享(源码+论文)

    Hi 大家好 这里是熊猫毕设 马上毕业季又要开始了 陆陆续续又要准备毕业设计了 有些学生轻而易举就搞定了 有些学生压根没有思路怎么做 可能是因为技术问题 也可能是因为经验问题 下边这些毕业设计项目中 大部分都是适用于有一定基础的同学哦 希望
  • 【元胞自动机】元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】

    博主简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 Matlab项目合作可私信 个人主页 海神之光 代码获取方式 海神之光Matlab王者学习之路 代码获取方式 座右铭 行百里者 半于九十 更多Matlab仿真内容点击 Matl
  • Mitigating Object Hallucinations in Large Vision-Language Models through Visual Contrastive Decoding

    通过视觉对比解码减轻大型视觉语言模型中的物体幻觉 Abstract 大视觉语言模型 LVLM 已经取得了长足的进步 将视觉识别和语言理解交织在一起 生成不仅连贯而且与上下文相协调的内容 尽管取得了成功 LVLM 仍然面临物体幻觉的问题 即模
  • Python核心编程之此时起步,为时不晚

    目录 一 前言 二 程序输出 print语句及 HelloWorld 三 程序输入和 raw input 内建函数
  • 数据仓库与数据挖掘复习资料

    一 题型与考点 第一种 1 解释基本概念 中英互译 解释简单的含义 2 简答题 每个10分有两个一定要记住 考时间序列Time series 第六章 的基本概念含义 解释 作用 序列模式挖掘的作用 考聚类 第五章 重点考密度聚类的定义描述
  • 【C语言】【数据结构】【手搓二叉树】用数组实现一个二叉树

    这里用数组 顺序表 实现一个二叉树 Heap h include