数据结构:堆的完整实现
堆(Heap)是一种特殊的完全二叉树,通常用数组来存储。它在优先级队列、堆排序等场景中非常常见。这里我们基于 C 语言来实现一个大根堆,涵盖初始化、插入、删除以及核心的堆化操作。
堆的核心概念
普通的二叉树不适合直接用数组存储,因为会有大量空间浪费。而完全二叉树非常适合顺序存储。
注意:这里的堆是数据结构概念,与操作系统内存管理中的堆区不同。
堆的性质:
- 父节点的值总是不大于或不小于其子节点的值。
- 总是一棵完全二叉树。
根据大小关系分为小根堆和大根堆。本文以大根堆为例,即父节点值 >= 子节点值。
结构定义
我们用结构体来封装堆的数据,包含动态数组基地址、当前元素个数和容量。
// Heap.h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int HeapDataType;
typedef struct HeapNode {
HeapDataType* base; // 堆存储数组基地址
int size; // 当前元素个数
int capacity; // 堆容量
} Heap;
在数组存储的二叉树中,下标计算遵循以下规律:
- 父节点:
(child - 1) / 2 - 左孩子:
parent * 2 + 1 - 右孩子:
parent * 2 + 2
核心功能实现
1. 初始化与销毁
初始化时分配初始空间,销毁时释放资源并重置指针。
// Heap.c
void HeapInit(Heap* pheap) {
assert(pheap);
// 初始容量设为 4,可根据实际情况调整
pheap->base = (HeapDataType*)malloc(sizeof(HeapDataType) * );
(pheap->base == ) {
perror();
;
}
pheap->size = ;
pheap->capacity = ;
}
{
assert(pheap);
(pheap->base);
pheap->base = ;
pheap->capacity = pheap->size = ;
}


