#include <stdio.h>
#include <stdlib.h>
/**
* 经常使用 heap 实现 优先级队列
*/
#define MAX_SIZE 100
#define True 1
#define False 0
typedef short Boolean;
typedef struct node* pNode;
struct node{
int data;
};
pNode heap[MAX_SIZE+1]; /// index of first element is 1
int size;
Boolean isFull();
Boolean isEmpty();
void insert(pNode);
pNode delete(); ///// delete the biggest node
void print();
pNode getMax();
#include "deap.h"
void print()
{
if(isEmpty()){
return;
}
int i = 1;
while(i <= size){
printf("%d ", heap[i++]->data);
}
printf("\n");
}
Boolean isFull()
{
if(size == MAX_SIZE+1) return True;
return False;
}
Boolean isEmpty()
{
if(size == 0) {
printf("Empty deap\n");
return True;
}
return False;
}
// while 循环从最大堆的 新叶子结点 开始,
// 沿着到根结点的路径,直到根结点
// 使其父结点 i/2 的值 不小于 要插入的值
void insert(pNode elem)
{
if(isFull(size)){
printf("sizeo space\n");
return;
}
int i = ++size;
while(i!=1 && elem->data > heap[i/2]->data){ /// 把父结点移动到其子结点位置
heap[i] = heap[i/2];
i /= 2;
}
heap[i] = elem;
}
/// 删除根元素,然后把最后一个元素设为根元素,
/// 接着进行调整,使之复合最大堆/最小堆
pNode delete(){
pNode res = 0;
if(isEmpty()){
return 0;
}
res = heap[1]; /// 得到最大元素
pNode last = heap[size--]; /// 得到最后一个元素
//heap[1] = last;
int parent = 1; //// 从新的 根元素 开始
int child = 2; /// 新的根元素的 孩子
while(child <= size){
if(child < size && heap[child]->data < heap[child+1]->data){ ////// 比较兄弟结点,取较大者的下标
child++;
}
if(heap[child]->data > last->data){ //// 如果 较大的子结点 大于 新的 根结点
heap[parent] = heap[child]; //// 那么把 该子结点 移动到 父结点位置
parent = child; /// 当前子结点设为 起点 重新开始移动
child *= 2;
}else{
break;
}
}
heap[parent] = last;
return res;
}
pNode getMax(){
if(!isEmpty()){
return heap[1];
}
return 0;
}
分享到:
相关推荐
二叉堆、二项堆和斐波那契堆是数据结构中的重要概念,它们都是堆数据结构的不同变体,主要用于高效地实现某些特定操作,如查找最大或最小元素、优先队列以及各种排序算法。在C++编程语言中,理解和实现这些堆结构...
二叉堆是一种特殊的数据结构,常用于实现优先队列或者优化某些算法。本篇将重点讨论PHP如何实现二叉堆及其主要操作,包括插入元素、删除元素等。 二叉堆通常分为两种类型:最大堆和最小堆。最大堆中每个节点的值都...
**二叉堆与AStar算法详解** 在计算机科学中,二叉堆是一种特殊的树形数据结构,它同时满足堆的两个性质:一个完全二叉树(每个层级除了最后一层外,都完全填充,并且所有节点尽可能地集中在左边)并且是有序的。...
二叉堆,也称为堆数据结构,是一种特殊的树形数据结构,它满足特定的属性:在二叉堆中,每个节点的值要么大于或等于其子节点(最大堆),要么小于或等于其子节点(最小堆)。这个特性使得二叉堆在处理与优先级相关的...
二叉堆是一种特殊的树形数据结构,常用于实现优先队列和某些排序算法,如堆排序。在C#中,二叉堆可以被用来高效地处理最大值或最小值的问题,尤其是在需要快速获取当前堆中最小元素的情况下。下面将详细探讨C#中二叉...
二叉堆是一种特殊的树形数据结构,它满足堆的特性:每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)它的子节点。在易语言中实现二叉堆,可以帮助我们高效地执行一些操作,如查找最大或最小元素、插入元素...
二叉堆实现A*寻路算法是计算机科学中一种经典的路径搜索方法,它结合了Dijkstra算法和优先级队列的特性,以高效的方式寻找从起点到目标点的最短路径。在这个C语言实例中,我们看到AStar.c、AStar.h、main.c和...
二叉堆是一种特殊的数据结构,它在计算机科学中扮演着重要的角色,特别是在优先队列和排序算法中。本文将深入探讨二叉堆的概念、性质、实现以及其在实际应用中的运用。 二叉堆是一个完全二叉树,可以分为两种类型:...
个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 直接执行该文件会执行文件中的测试样例 使用时在头部如此声明 from binaryheap import BinaryHeap bh = BinaryHeap(heap_size) # heap_...
c++实现的二叉堆,很好的编程规范,可以学到模板、inline函数、引用的实际应用。代码写的很简洁
在本文中,我们将深入探讨A*(A星)算法及其与二叉堆的结合使用,特别是在C++编程语言中的实现。A*算法是一种在图中寻找最短路径的搜索算法,而二叉堆则是一种高效的优先队列数据结构,常用于优化路径查找过程。 ...
### 二叉堆、并查集与树状数组详解 #### 一、二叉堆(Binary Heap) ##### 1. 二叉堆概述 - **定义**:二叉堆是一种特殊的完全二叉树结构,其中每个节点的值都小于等于其子节点的值(最小堆)或大于等于其子节点的...
二叉堆的C++实现,包含二叉堆的构造,插入,删除,销毁等操作
dijkstra算法的三种实现:数组,二叉堆,斐波那契堆 + 部分实验报告 dijkstra算法的三种实现:数组,二叉堆,斐波那契堆 + 部分实验报告 dijkstra算法的三种实现:数组,二叉堆,斐波那契堆 + 部分实验报告
个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 可在外部写脚本对该文件进行测试 需要继承Tuple类实现排序对象类型,并实现Tuple的抽象方法weight()来反映排序对象权重
二叉堆是一种特殊的树形数据结构,它同时满足堆的两个基本特性:完全二叉树和堆序性质。在二叉堆中,可以分为最大堆和最小堆两种类型。最大堆规定每个节点的值都大于或等于其子节点的值,而最小堆则相反,每个节点的...
使用c++实现最小堆。提供常见操作,如堆化数组,插入,删除,堆排序,遍历堆。
二叉堆是一种特殊的树形数据结构,它满足堆属性:在一个完全二叉树中,每个节点的值都大于或等于其子节点的值(大顶堆)或小于或等于其子节点的值(小顶堆)。在C++中,我们可以自定义二叉堆的数据结构并实现相关...
本源代码借助标准C++ STL中的vector,list和heap等已封装的数据结构,优化了A星算法搜索地图、检索开始列表过程,减小了程序的时间和空间花费。经检验,检索20000*20000的随机障碍物地图时,程序在规划路径部分的平均...
本人做的一个二叉堆的课件,附带STL中的priority_queue