C#实现最小堆最大堆 完整代码
先说思路,后上完整代码。
新手一定要先学完全二叉树,再学二叉堆,有些人喜欢叫大顶堆小顶堆,也可以叫最小堆最大堆,一个意思。学会最小堆自然明白最大堆,我这里以最小堆为例。
最小堆:所有节点的值都<=子节点值。
最大堆:所有节点的值都>=子节点值。
首先要记住3个公式。

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

每次从末尾插入节点的时候,需要和父节点比较,满足条件就交换位置,重复这个过程直到新插入的节点<=父节点或者再无父节点,也就是到达顶部。
看着上图想象一下这个过程,假如在末尾新加入节点0,需要和5交换,再和3交换,最后和1交换,最后达到一个从小到大的排列。
移除头节点该怎么操作呢?新手朋友可能会想,从头结点开始往下交换不就行了吗?会遇到空洞问题,如图所示。

正确做法如下:
1.直接用头节点和末尾节点进行交换
2.移除尾节点.
3.从头结点开始,和左右节点中最小值进行交换,如此循环至底部。
至此,思路讲解完毕,下面是完整代码。