二叉堆因为对应着一棵完全二叉树,因而可以通过线性数组的方式实现。

  • 注意,数组第 0 个位置上的元素,作为根,还是第 1 个位置上的元素作为根?

    • 本文给出的实现,以数组第 1 个位置上的元素作为根,则其两个孩子 ⇒ 2*i, 2*i+1
    • 而第 0 个位置上的元素,则用来作为标志变量(Size 不包括此变量);
  • 在元素逐个插入的过程中(插入在合适的位置),实现二叉堆的构建;自然删除也需按着指定的规则;

1. 声明

struct HeapStruct;
typedef struct HeapStruct* PriorityQueue; PriorityQueue Init(int MaxElements);
...
void Insert(ElementType X, PriorityQueue PQ);
ElementType DeleteMin(PriorityQueue PQ);

2. 实现

struct HeapStruct {
int Capacity;
int Size;
ElementType* Elements;
}; PriorityQueue Init(int MaxElements){
PriorityQueue PQ;
PQ = (PriorityQueue)malloc(sizeof(struct HeapStruct));
if (!PQ) ....
PQ->Elements = (ElementType)malloc(MaxElements*sizeof(ElementType));
if (!PQ) ...
PQ->Capacity = MaxElements;
PQ-Size = 0;
PQ->Elements[0] = INT_MIN;
} void Insert(ElementType X, PriorityQueue PQ) {
if (IsFull(PQ)) ...
for (int i = ++PQ->Size; PQ->Elements[i/2] > X; i /= 2) {
PQ->Elements[i] = PQ->Elements[i/2];
}
PQ->Elements[i] = X;
}

比较困难的是删除时,二叉堆结构在线性数组上的维持:

ElementType DeleteMin(PriorityQueue PQ) {
if (IsEmpty(PQ)) ...
ElementType MinElement, LastElement;
MinElement = PQ->Elements[1];
LastElement = PQ->Elements[PQ->Size--];
int Child;
for (int i = 1; i*2 <= PQ->Size; ++i) {
Child = 2*i;
if (Child != PQ->Size && PQ->Elements[Child+1] < PQ->Elements[Child])
Child = Child + 1;
if (PQ->Elements[Child] < LastElement)
PQ->Element[i] = PQ->Elements[Child];
else
break;
}
PQ->Elements[i] = LastElement;
return MinElement;
}

最新文章

  1. Unity3D ogg下载并播放
  2. Css 常用属性
  3. 懒加载异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
  4. 手写归并排序(MergeSort)
  5. bzoj2729
  6. CAD教程/视频教程/软件类专题资料免费下载整理合集
  7. 安装sunvirtualbox
  8. 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
  9. UNIX环境高级编程——System V 共享内存区
  10. linux查看分区是否开启acl权限
  11. Linux 故障问题处理
  12. EXTENDED LIGHTS OUT
  13. c#分布式ID生成器
  14. 1、原生jdbc连接oracle数据库简单介绍
  15. Win10系统的SurfacePro4的触摸笔如何使用
  16. Objective-C语法之代码块(block)的使用 (转载)
  17. 从零自学Java-3.在程序中存储和修改变量信息
  18. 伤不起:File.toPath() &amp; Paths.get()
  19. 【原创】python __all__ 的用法
  20. windows上配置连接git

热门文章

  1. 1.10 Python基础知识 - 序列:列表
  2. AndroidStudio 内存泄漏分析 Memory Monitor
  3. Android 利用代码在屏幕中间位置显示ProgressDialog和ProgressBar
  4. 洛谷 P1458 顺序的分数 Ordered Fractions
  5. Qt学习 之 Socket通信
  6. R语言- 基本统计分析
  7. SVN—怎样安装SVNclient软件
  8. 嵌入式Qt-4.8.6显示中文并且改变字体大小和应用自己制作的字体库
  9. 从零开始使用git第一篇:下载安装配置
  10. 高效的敏感词过滤方法(PHP)