【数据结构】二叉树-堆

二叉树-堆

堆是一种特殊的二叉树,具有二叉树特性的同时,还具备其他特性。
堆一般使用顺序结构的数组来存储数据。

堆分为:

  • 小根堆
  • 大根堆

小根堆: 父节点的元素小于或等于左右子结点的元素。
大根堆: 父节点的元素大于或等于左右子节点的元素。

这里我们一大根堆为例。

cpp 复制代码
//.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<time.h>

typedef int HPDataType;

typedef struct Heap
{
	HPDataType* arr;
	int size;
	int capacity;
}HP;

void HPInit(HP*php);//堆初始化
void HPDestory(HP*php);//堆的销毁

void HPPush(HP*php,HPDataType x);//堆插入数据
void HPPop(HP*php);//出堆
bool HPEmpty(HP*php);//判断堆是否为空
HPDataType HPTop(HP*php);//获取堆顶元素
HPDataType HPSize(HP*php);//堆中数据个数

void AdjustDown(HPDataType* arr, int parent, int n);
void AdjustUp(HPDataType* arr, int child);
void Swap(int* x, int* y);
cpp 复制代码
//.c
#include"Heap.h"

void HPInit(HP* php)//堆初始化
{
	assert(php);
	php->arr = NULL;
	php->capacity = php->size = 0;
}

void HPDestory(HP* php)//堆的销毁
{
	assert(php);
	if (php->arr)
	{
		free(php->arr);
	}


	php->arr = NULL;
	php->capacity = php->size = 0;
}

void Swap(int*x,int*y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

void AdjustUp(HPDataType*arr,int child) 
{
	assert(arr);
	int parent = (child - 1) / 2;
	while (child>0)
	{
		if (arr[child]>arr[parent])
		{
			Swap(&arr[parent],&arr[child]);
			child = parent;
			parent = (child-1)/2;
		}
		else
		{
			break;
		}
	}
}


void HPPush(HP* php, HPDataType x)//堆插入数据
{
	assert(php);

	if (php->capacity==php->size)
	{
		int newnode = php->capacity == 0 ? 4 : 2 * php->capacity;
		HPDataType* tmp = (HPDataType*)realloc(php->arr,newnode*sizeof(HPDataType));
		assert(tmp);

		php->arr = tmp;
		php->capacity = newnode;
	}

	php->arr[php->size] = x;
	AdjustUp(php->arr,php->size);
	php->size++;
}

void AdjustDown(HPDataType*arr,int parent,int n)
{
	assert(arr);
	int child = parent * 2 + 1;
	while (child<n)
	{
		if (child+1<n&&arr[child]<arr[child+1])
		{
			child++;
		}
		if (arr[child]>arr[parent])
		{
			Swap(&arr[child],&arr[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}


void HPPop(HP* php)//出堆
{
	assert(php&&php->size);
	Swap(&php->arr[0],&php->arr[php->size-1]);
	--php->size;

	AdjustDown(php->arr,0,php->size);
}

bool HPEmpty(HP* php)//判断堆是否为空
{
	assert(php);
	return php->size == 0;
}

HPDataType HPTop(HP* php)//获取堆顶元素
{
	assert(php);
	return php->arr[0];
}

HPDataType HPSize(HP* php)//堆中数据个数
{
	assert(php);
	return php->size;
}
相关推荐
爱读书的小胖26 分钟前
LeetCode 27. 移除元素(C)解题分析
数据结构·算法
爱读书的小胖1 小时前
Codewars: A Brave New Wordle(C)解题分析
c语言·数据结构·算法
Escalating_xu1 小时前
【数据结构】顺序表的应用:动态通讯录项目与双指针经典算法
c语言·数据结构·算法
从小白到软工2 小时前
C语言(中)预告
c语言·数据结构·经验分享·ai编程
垆边人似月.2 小时前
华为题:任务调度
数据结构·c++·算法
Logic1012 小时前
C语言/数据结构字符串题解:解压缩“字符+次数“格式——多位数字处理与字符串还原
c语言·数据结构·字符串·模拟·时间复杂度·空间复杂度·算法题
信奥卷王2 小时前
[GESP202506 六级] 最大因数(含视频)
数据结构·算法
局部有解2 小时前
Leetcode - 42 接雨水(一维)
数据结构·c++·算法·leetcode
专注API从业者3 小时前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质