欢迎光临散文网 会员登陆 & 注册

C#实现最小堆最大堆 完整代码

2023-04-09 17:22 作者:枪神笑  | 我要投稿

先说思路,后上完整代码。

新手一定要先学完全二叉树,再学二叉堆,有些人喜欢叫大顶堆小顶堆,也可以叫最小堆最大堆,一个意思。学会最小堆自然明白最大堆,我这里以最小堆为例。

最小堆:所有节点的值都<=子节点值。

最大堆:所有节点的值都>=子节点值。

首先要记住3个公式。

完全二叉树采用数组存储比链式存储更好,因为链式存储需要额外空间存储左右子节点。这也是为什么完全二叉树需要最后一层叶子节点靠左排列。

典型的最小堆

每次从末尾插入节点的时候,需要和父节点比较,满足条件就交换位置,重复这个过程直到新插入的节点<=父节点或者再无父节点,也就是到达顶部。

看着上图想象一下这个过程,假如在末尾新加入节点0,需要和5交换,再和3交换,最后和1交换,最后达到一个从小到大的排列。


移除头节点该怎么操作呢?新手朋友可能会想,从头结点开始往下交换不就行了吗?会遇到空洞问题,如图所示。


正确做法如下:

1.直接用头节点和末尾节点进行交换

2.移除尾节点.

3.从头结点开始,和左右节点中最小值进行交换,如此循环至底部。

至此,思路讲解完毕,下面是完整代码。


C#实现最小堆最大堆 完整代码的评论 (共 条)

分享到微博请遵守国家法律