【数据结构】二叉树-堆

二叉树-堆

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

堆分为:

  • 小根堆
  • 大根堆

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

这里我们一大根堆为例。

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;
}
相关推荐
时间幻灭‘1 小时前
数据结构(2):LinkedList和链表[2]
数据结构·链表
CPP_ZhouXuyang1 小时前
C语言——模拟实现strcpy
c语言·开发语言·数据结构·算法·程序员创富
QXH2000002 小时前
数据结构—双向链表
c语言·数据结构·算法·链表
旺小仔.2 小时前
【数据结构篇】~排序(1)之插入排序
c语言·数据结构·算法·链表·性能优化·排序算法
尘心cx3 小时前
数据结构-顺序表
数据结构
问道飞鱼3 小时前
每日一个数据结构-跳表
数据结构
Crossoads3 小时前
【数据结构】排序算法---希尔排序
c语言·开发语言·数据结构·算法·排序算法
jingling5554 小时前
后端开发刷题 | 最长上升子序列
java·开发语言·数据结构·后端·算法·动态规划
Crossoads5 小时前
【数据结构】十大经典排序算法总结与分析
c语言·开发语言·数据结构·算法·排序算法
liangbm35 小时前
MATLAB系列04:循环结构
开发语言·数据结构·matlab·for循环·循环结构·工程基础·程序流程