【数据结构】二叉树-堆

二叉树-堆

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

堆分为:

  • 小根堆
  • 大根堆

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

这里我们一大根堆为例。

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;
}
相关推荐
lisin-lee-cooper6 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-6 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
哭泣方源炼蛊7 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集
五_谷_丰_登9 小时前
平衡二叉树(AVL)讲解二
数据结构·c++
fpcc10 小时前
数据结构和算法—最短路径的算法
数据结构·算法
Mr. zhihao11 小时前
从数组到 B+ 树:一棵树的进化史
数据结构·innodb·b+树
船厂电气自动化ai大模型11 小时前
AI大模型与数学第64课:矩阵×向量乘法(神经网络矩阵运算底层)
数据结构·深度学习·线性代数·机器学习·推荐算法
小欣加油12 小时前
Leetcode2058 找出临界点之间的最小和最大距离
数据结构·c++·算法·leetcode·职场和发展
CoderYanger13 小时前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
带多刺的玫瑰13 小时前
Leecode#16刷题之最接近的三数之和
数据结构·算法