欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 【数据结构】二叉树-堆

【数据结构】二叉树-堆

2024/11/30 12:43:13 来源:https://blog.csdn.net/yzqy_/article/details/140961351  浏览:    关键词:【数据结构】二叉树-堆

二叉树-堆


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

堆分为:

  • 小根堆
  • 大根堆

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

这里我们一大根堆为例。

//.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);
//.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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com