`

二叉堆

阅读更多
#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 的二叉堆操作

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

    基于二叉堆的AStar算法演示程序

    **二叉堆与AStar算法详解** 在计算机科学中,二叉堆是一种特殊的树形数据结构,它同时满足堆的两个性质:一个完全二叉树(每个层级除了最后一层外,都完全填充,并且所有节点尽可能地集中在左边)并且是有序的。...

    java-二叉堆(堆)binaryHeap

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

    C# 二叉堆

    二叉堆是一种特殊的树形数据结构,常用于实现优先队列和某些排序算法,如堆排序。在C#中,二叉堆可以被用来高效地处理最大值或最小值的问题,尤其是在需要快速获取当前堆中最小元素的情况下。下面将详细探讨C#中二叉...

    易语言二叉堆

    二叉堆是一种特殊的树形数据结构,它满足堆的特性:每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)它的子节点。在易语言中实现二叉堆,可以帮助我们高效地执行一些操作,如查找最大或最小元素、插入元素...

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

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

    二叉堆代码

    二叉堆是一种特殊的数据结构,它在计算机科学中扮演着重要的角色,特别是在优先队列和排序算法中。本文将深入探讨二叉堆的概念、性质、实现以及其在实际应用中的运用。 二叉堆是一个完全二叉树,可以分为两种类型:...

    二叉堆 最小堆 Python 实现

    个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 直接执行该文件会执行文件中的测试样例 使用时在头部如此声明 from binaryheap import BinaryHeap bh = BinaryHeap(heap_size) # heap_...

    二叉堆c++代码

    c++实现的二叉堆,很好的编程规范,可以学到模板、inline函数、引用的实际应用。代码写的很简洁

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

    在本文中,我们将深入探讨A*(A星)算法及其与二叉堆的结合使用,特别是在C++编程语言中的实现。A*算法是一种在图中寻找最短路径的搜索算法,而二叉堆则是一种高效的优先队列数据结构,常用于优化路径查找过程。 ...

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

    ### 二叉堆、并查集与树状数组详解 #### 一、二叉堆(Binary Heap) ##### 1. 二叉堆概述 - **定义**:二叉堆是一种特殊的完全二叉树结构,其中每个节点的值都小于等于其子节点的值(最小堆)或大于等于其子节点的...

    二叉堆的实现

    二叉堆的C++实现,包含二叉堆的构造,插入,删除,销毁等操作

    dijkstra算法的三种实现:数组,二叉堆,斐波那契堆 + 部分实验报告

    dijkstra算法的三种实现:数组,二叉堆,斐波那契堆 + 部分实验报告 dijkstra算法的三种实现:数组,二叉堆,斐波那契堆 + 部分实验报告 dijkstra算法的三种实现:数组,二叉堆,斐波那契堆 + 部分实验报告

    二叉堆最小堆的Java实现

    个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 可在外部写脚本对该文件进行测试 需要继承Tuple类实现排序对象类型,并实现Tuple的抽象方法weight()来反映排序对象权重

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

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

    二叉堆:最小堆

    使用c++实现最小堆。提供常见操作,如堆化数组,插入,删除,堆排序,遍历堆。

    C++二叉堆实现.zip

    二叉堆是一种特殊的树形数据结构,它满足堆属性:在一个完全二叉树中,每个节点的值都大于或等于其子节点的值(大顶堆)或小于或等于其子节点的值(小顶堆)。在C++中,我们可以自定义二叉堆的数据结构并实现相关...

    基于二叉堆优化的A星算法

    本源代码借助标准C++ STL中的vector,list和heap等已封装的数据结构,优化了A星算法搜索地图、检索开始列表过程,减小了程序的时间和空间花费。经检验,检索20000*20000的随机障碍物地图时,程序在规划路径部分的平均...

    二叉堆(binary heap)

    本人做的一个二叉堆的课件,附带STL中的priority_queue

Global site tag (gtag.js) - Google Analytics