【数据结构】二叉树-堆

二叉树-堆

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

堆分为:

  • 小根堆
  • 大根堆

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

这里我们一大根堆为例。

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;
}
相关推荐
我不会编程55519 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
owde20 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头20 小时前
分享宝藏之List转Markdown
数据结构·list
蒙奇D索大21 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西21 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
烂蜻蜓21 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
守正出琦1 天前
日期类的实现
数据结构·c++·算法
ゞ 正在缓冲99%…1 天前
leetcode75.颜色分类
java·数据结构·算法·排序
爱爬山的老虎1 天前
【面试经典150题】LeetCode121·买卖股票最佳时机
数据结构·算法·leetcode·面试·职场和发展
SweetCode1 天前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习