【PTA】最小堆
最小堆,是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于其左子节点和右子节点的值。
也就是位于堆顶的元素是整棵完全二叉树中数据值最小的。
操作
将一棵完全二叉树转换成堆
注意,在这种写法下,根节点的编号是0,对于任意一个结点,它的编号为x,其所对应的左儿子结点的编号为2*x+1
,其所对应的右儿子结点编号为2*x+2
。
其中外层循环i能够提取出每一个非叶子结点。
而对于每一个非叶子结点我们是按照深度由大到小依类进行处理的。
对于内层循环来讲,因为我们是要去将整个完全二叉树直接拿出来,并且将视野单独局限在一个由三个元素组成的小三角形中去,且要将这三个元素中最小的一个放置到这个小三角形的顶部。
因而在第一步的时候我们可以先选择将两个儿子结点进行一个比较,但注意,位于底部右侧单独拎出来的那个小三角形,可能只具有一个儿子结点。
因而我们需要先做一个判断,child+1<=N-1
其次,如果A[child+1]<A[child],那么就对child进行一个加一操作,使得child代表A数组中元素最小的位置。
而如果一旦A[child]比A[root]来得小的话,两者就会交换位置,也可以认为Tmp会下放到下一个三角形的顶部,而最终Tmp应该放到j停在的地方。