`
u010815305
  • 浏览: 30543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据结构学习之二叉堆

 
阅读更多
#ifndef _BinHeap_h
struct HeapStruct;
typedef struct HeapStruct *PriorityQueue;

PriorityQueue Initialize(int MaxElements);
void Destroy(PriorityQueue H);
void MakeEmpty(PriorityQueue H);
void Insert(ElementType X,PriorityQueue H);
ElementType DeleteMin(PriorityQueue H);
ElementType FindMin(PriorityQueue H);
int IsEmpty(PriorityQueue H);
int IsFull(PriorityQueue H);

#endif
//一个堆数据结构将由一个数组,一个代表最大值的整数以及当前的堆大小组成
struct HeapStruct
{
int Capacity;
int Size;
ElementType *Elements;
}
//堆序性:在一个堆中,对于每一个节点X,X的父亲节点中的关键字小于或等于X中的关键字(根节点除外)

//优先队列的声明

PriorityQueue Initialize(int MaxElements)
{
PriorityQueue H;
if(MaxElements<MinPQSize)
Error("PriorityQueue size is too small");
H=malloc(sizeof(struct HeapStruct));
if(H==NULL)
FatalError("out of space");
H->Elements=malloc((MaxElements+1)*sizeof(ElementType));
if(H->Elements==NULL)
FatalError("out if space");
H->Capacity=MaxElements;
H->Size=0;
H->Elements[0]=MinData;
return H;
}
//插入一个二叉堆
void Insert(ElementType X.PriorityQueue H)
{
int i;
if(IsFull(H))
{
Error("PriorityQueue is full");
return ;
}
for(i=++H->Size;H->Elements[i/2]>X;i/=2)
/*对于数组中的任一位置i上的元素,其左儿子在位置2i上
右儿子在左儿子后的单元(2i+1),他的父亲在(1/2)
*/

H->Elements[i]=H->Elements[1/2];
H->Elements[i]=X;
}
//在二叉堆中执行DeleteMin
ElementType DeleteMin(PriorityQueue H)
{
int i,Child;
ElementType MaxElement,LastElement;
if(IsEmpty(H)
{
Error("PriorityQueue is empty");
return H->Elements[0];
}
MinElement=H->Elements[1];
LastElement=H->Elements[H->Size--];


for(i=1;i*2<=H->Size;i=Child)
{
Child=i*2;
if(Child!=H->Size&&H->Elements[Child+1]
<H->Elements[Child])
Child++;
if(LastElement>H->Elements[Child])
H->Elements[i]=H->Elements[Child];
else
break;

}
H->Elements[i]=LastElement;
return MinElement;
}
int IsEmpty( PriorityQueue H )
{
return H->Size == 0;
}

int IsFull( PriorityQueue H )
{
return H->Size == H->Capacity;
}

void Destroy( PriorityQueue H )
{
free( H->Elements );
free( H );
}
ElementType FindMin( PriorityQueue H )
{
if( !IsEmpty( H ) )
return H->Elements[ 1 ];
Error( "Priority Queue is Empty" );
return H->Elements[ 0 ];
}
分享到:
评论

相关推荐

    二叉堆(最小堆)+二项堆+斐波那契堆

    二叉堆、二项堆和斐波那契堆是数据结构中的重要概念,它们都是堆数据结构的不同变体,主要用于高效地实现某些特定操作,如查找最大或最小元素、优先队列以及各种排序算法。在C++编程语言中,理解和实现这些堆结构...

    php 的二叉堆操作

    二叉堆是一种特殊的数据结构,常用于实现优先队列或者优化某些算法。本篇将重点讨论PHP如何实现二叉堆及其主要操作,包括插入元素、删除元素等。 二叉堆通常分为两种类型:最大堆和最小堆。最大堆中每个节点的值都...

    易语言二叉堆

    二叉堆是一种特殊的树形数据结构,它满足堆的特性:每个节点的值都大于或等于(最大堆)或小于或等于(最小堆...通过分析提供的易语言二叉堆源码,我们可以深入学习这种数据结构的实现细节,从而更好地应用于实际项目。

    java-二叉堆(堆)binaryHeap

    二叉堆,也称为堆数据结构,是一种特殊的树形数据结构,它满足特定的属性:在二叉堆中,每个节点的值要么大于或等于其子节点(最大堆),要么小于或等于其子节点(最小堆)。这个特性使得二叉堆在处理与优先级相关的...

    二叉堆的相关代码.zip二叉堆的学习与思考

    二叉堆是一种特殊的树形数据结构,它同时满足堆的两个基本特性:完全二叉树和堆序性质。在二叉堆中,可以分为最大堆和最小堆两种类型。最大堆规定每个节点的值都大于或等于其子节点的值,而最小堆则相反,每个节点的...

    SuanFan.zip_A二叉堆_A星 二叉堆_C++_c++11 a星算法_二叉堆

    A*算法是一种在图中寻找最短路径的搜索算法,而二叉堆则是一种高效的优先队列数据结构,常用于优化路径查找过程。 首先,A*算法的核心在于其引入了启发式信息来指导搜索方向,从而提高效率。它通过结合实际代价(g...

    二叉堆实现A*寻路算法c语言实例

    二叉堆实现A*寻路算法是计算机科学中一种经典的路径搜索方法,它结合了Dijkstra算法和优先级队列的特性,以高效的方式寻找从起点到目标点的最短路径。在这个C语言实例中,我们看到AStar.c、AStar.h、main.c和...

    C++二叉堆实现.zip

    二叉堆是一种特殊的树形数据结构,它满足堆属性:在一个完全二叉树中,每个节点的值都大于或等于其子节点的值(大...理解二叉堆的基本概念、操作以及在C++中的实现细节,有助于深入学习数据结构和算法,提升编程能力。

    易语言二叉堆源码.rar

    通过分析和学习这个源码,我们可以深入理解二叉堆的内部工作原理以及如何用易语言来实现这种数据结构。 源码文件"Q9E3hFCN.e"可能是易语言的源代码文件,通常易语言的源代码文件扩展名为".e"。这个文件可能包含了...

    易语言源码易语言二叉堆源码.rar

    本压缩包“易语言源码易语言二叉堆源码.rar”提供了易语言实现的二叉堆数据结构的源代码,对于学习易语言以及理解二叉堆这一数据结构的实现非常有帮助。 二叉堆是计算机科学中一种重要的数据结构,通常分为最大堆和...

    二叉堆、并查集和树状数组.pdf

    ### 二叉堆、并查集与树状数组详解...综上所述,二叉堆、并查集和树状数组都是计算机科学领域非常重要的数据结构,它们各自有着独特的特性和应用场景。通过对这些数据结构的学习和掌握,我们可以更高效地解决实际问题。

    易语言二叉堆源码.7z

    以上所述,易语言二叉堆源码的学习涵盖了数据结构、算法、易语言编程等多个方面,对于提升编程能力具有很大帮助。在实践中不断探索和学习,能让你更好地掌握这些知识,并应用于实际项目开发中。

    数据结构二叉树源代码

    二叉树是一种重要的数据结构,在计算机科学中广泛应用于搜索、排序、图形表示等多种场景。它由节点构成,每个节点最多有两个子节点,分别被称为左子节点和右子节点。二叉树的特性使得它们在算法设计中具有高效性和...

    数据结构二叉树二叉搜索树堆相关C++代码.docx

    在给定的文件中,我们关注的是数据结构相关的C++代码,特别是涉及到二叉树、二叉搜索树和堆的概念。下面将详细解释这些概念及其在C++中的实现。 首先,二叉树是一种特殊的图,其中每个节点最多有两个子节点,通常...

    广东工业大学-优先队列和二叉堆.pdf

    在广东工业大学的教程中,优先队列和二叉堆是数据结构的重要组成部分。优先队列是一种特殊的队列,其元素具有优先级属性,元素的出队顺序依赖于优先级而非入队顺序。二叉堆是一种特殊的完全二叉树,可以用来实现优先...

    兰州大学数据结构实验全集 数据结构 链表 约瑟夫问题 KMP 模式匹配 二叉排序树 llink-rlink 关键路径 堆排序

    本实验全集涵盖了多个重要的数据结构及其相关的算法,包括链表、约瑟夫问题、KMP模式匹配、二叉排序树、llink-rlink算法、关键路径以及堆排序。以下是对这些知识点的详细解释: 1. **链表**:链表是一种线性数据...

    数据结构二叉平衡树课程设计

    在数据结构的学习中,理解和掌握二叉平衡树是至关重要的。 1. **二叉搜索树(BST)基础**: - 二叉搜索树是一种特殊的二叉树,其中每个节点都具有一个键(key),且左子树中的所有节点的键都小于当前节点,右子树...

    数据结构实验:最小最大堆的构建

    最小最大堆是一种特殊的二叉堆数据结构,它同时满足最小堆和最大堆的特性。在最小最大堆中,根节点是所有元素中的最小值,而每个子树中又包含一个最大值。这样的设计使得在处理某些特定问题时,如查找最小和最大元素...

    学生成绩管理系统(数据结构课程设计)

    【学生成绩管理系统】是一个基于数据结构的课程设计项目,旨在锻炼学生的编程能力和软件开发实践。该系统的主要功能包括身份验证、权限管理、成绩录入、查询、排序、统计以及数据的持久化存储。 1. **身份验证与...

Global site tag (gtag.js) - Google Analytics