【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;
}
相关推荐
四谎真好看1 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
Dfreedom.2 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
报错小能手3 小时前
linux学习笔记(45)git详解
linux·笔记·学习
Larry_Yanan3 小时前
QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName
开发语言·c++·笔记·qt·学习·ui·交互
Want5954 小时前
C/C++大雪纷飞①
c语言·开发语言·c++
知花实央l4 小时前
【算法与数据结构】拓扑排序实战(栈+邻接表+环判断,附可运行代码)
数据结构·算法
吃着火锅x唱着歌4 小时前
LeetCode 410.分割数组的最大值
数据结构·算法·leetcode
摇滚侠5 小时前
Spring Boot 3零基础教程,WEB 开发 默认页签图标 Favicon 笔记29
java·spring boot·笔记
AI科技星6 小时前
垂直原理:宇宙的沉默法则与万物运动的终极源头
android·服务器·数据结构·数据库·人工智能
酌量7 小时前
基于3D激光点云的障碍物检测与跟踪---(1)体素下采样、ROI 区域裁剪与地面点云分割
笔记·机器人·ransac·障碍物检测·激光点云·roi·体素下采样