前言:
关于最大堆和最小堆的题目,我做过了很多次,但是好像没有一个是完全独立AC的。2021春季PAT考试的前一天,天梯赛校内赛还专门考了最小堆,我复习了一下,结果第二天PAT考了最大堆,又是没做出来…天梯赛快到了,打算写篇博客整理一下最大堆和最小堆问题的解法。
正文:
最大堆和最小堆(又称大顶堆和小顶堆)问题一般是建立一个普通的数组,根据二叉树的性质对其进行交换移动。
建堆的方式有全放进去再排,也有边插入边排序的。由于最大堆和最小堆是不唯一的,因此这两种方式得出来的结果是不唯一的,一定要仔细地阅读题意,分清楚题目要求的是哪种方式~
对于最大堆来说,如果是插入式的,做法是一个个地插入,每次插入的时候,最大堆向上调整,即当前元素比父节点大的时候,就交换顺序。如果是一次次全部放好再生成堆的,需要从最后一个元素开始,依次向下调整,即当前元素选择与最大的父节点进行交换。
对于最小堆来说,如果是插入式的,做法是一个个地插入到最后面,每次插入的时候,向上调整,与最大堆同理。如果是后者建堆,则从最后一个结点开始,依次向下调整。
注:不难发现,对叶节点进行向下调整不会发生任何操作,因此,我们可以从非叶节点开始,也就是最大节点的下标除以2。