TypeScript数据结构与算法二叉堆

上一篇《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


转载请注明:http://www.92nongye.com/xxnr/xxnr/204625778.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了