【数据结构】二叉树-堆

二叉树-堆

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

堆分为:

  • 小根堆
  • 大根堆

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

这里我们一大根堆为例。

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;
}
相关推荐
Mr Xu_1 天前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
czxyvX1 天前
017-AVL树(C++实现)
开发语言·数据结构·c++
数智工坊1 天前
【数据结构-队列】3.2 队列的顺序-链式实现-双端队列
数据结构
elseif1231 天前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
徐小夕@趣谈前端1 天前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
Nebula_g1 天前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
xuxie991 天前
day 23 树
数据结构
EnglishJun1 天前
数据结构的学习(四)---栈和队列
数据结构·学习
数智工坊1 天前
【数据结构-特殊矩阵】3.5 特殊矩阵-压缩存储
数据结构·线性代数·矩阵
芝士爱知识a1 天前
AlphaGBM 深度解析:下一代基于 AI 与蒙特卡洛的智能期权分析平台
数据结构·人工智能·python·股票·alphagbm·ai 驱动的智能期权分析·期权