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

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

Heap.h

c 复制代码
#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

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

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;
}
相关推荐
aqymnkstkw6 分钟前
2024年【电气试验】考试题库及电气试验模拟试题
大数据·c语言·人工智能·嵌入式硬件·安全
小米里的大麦17 分钟前
【C++】深入理解引用:从基础到进阶详解
c++·经验分享·笔记·引用·引用和指针
MowenPan199526 分钟前
高等数学 3.5 函数的极值与最大值最小值
笔记·学习·高等数学
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑27 分钟前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
天下无贼!43 分钟前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
重生之我要进大厂2 小时前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
HinsCoder2 小时前
【渗透测试】——Upload靶场实战(1-5关)
笔记·学习·安全·web安全·渗透测试·测试·upload靶场
听风若依2 小时前
排序学习笔记
笔记·学习
Filotimo_2 小时前
【自然语言处理】实验三:新冠病毒的FAQ问答系统
人工智能·经验分享·笔记·python·学习·自然语言处理·pycharm
Happy鱿鱼3 小时前
C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)
c语言·开发语言·数据结构