【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;
}
相关推荐
qystca2 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱2 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
Komorebi.py3 小时前
【Linux】-学习笔记05
linux·笔记·学习
亦枫Leonlew3 小时前
微积分复习笔记 Calculus Volume 1 - 6.5 Physical Applications
笔记·数学·微积分
盼海4 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
网易独家音乐人Mike Zhou7 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
冰帝海岸8 小时前
01-spring security认证笔记
java·笔记·spring
小二·9 小时前
java基础面试题笔记(基础篇)
java·笔记·python
搬砖的小码农_Sky10 小时前
C语言:数组
c语言·数据结构
先鱼鲨生11 小时前
数据结构——栈、队列
数据结构