上一篇《TypeScript数据结构与算法:红黑树》实现了Typescript中自平衡的红黑树的数据结构与算法,本篇继续实现二叉堆(Heap)。
二叉堆二叉堆是一种特殊的二叉树,能高效、快速地找出最大值和最小值,常被应用于优先队列,也被用于著名的堆排序算法中,它有两个特性:
结构特性:它是一棵完全二叉树,表示树的每一层都有左侧和右侧子节点(除了最后一层的叶节点),并且最后一层的叶节点尽可能都是左侧子节点。堆特性:二叉堆不是最小堆就是最大堆。最小堆允许你快速提取树的最小值,最大堆允许你快速提取树的最大值。所有的节点都大于等于(最大堆)或小于等于(最小堆)每个它的子节点。如下图,满足堆有序的完全二叉树,也就是二叉堆:
二叉堆表示法在之前表示二叉树数据结构时,都是使用的专门的树数据结构,通过引用来指向左右子节点。但是由于二叉堆是个完全二叉树,所以可以使用更简单的数组结构来实现,如下图所示,位置k的节点的父节点的位置为?k/2?,而它的两个子节点的位置则分别为2k和2k+1。这样通过计算数组的索引在就可以在树中上下移动:从a[k]向上一层就令k等于k/2,向下一层则令k等于2k或2k+1。
数据结构实现交换元素首先实现一个辅助方法,用于交换数组中的两个元素,使用了ES6的解构赋值:
/***
description:交换数组中的两个位置处的值*/exportfunctionswap(array:any[],a:number,b:number){[array[a],array[b]]=[array[b],array[a]];}二叉堆类实现一个最小二叉堆MinHeap类。最大堆类似,只要将比较函数取反为reverseCompare即可。
在类中实现了一些基础方法,比如获取左子节点,右子节点和父节点索引等方法:
import{Compare,defaultCompare,ICompareFunction,reverseCompare,swap}from"../util";//最小堆类exportclassMinHeapT{protectedheap:T[]=[];constructor(protected