堆的建成--无序序列开始
如果一个二叉树只有一个结点,那它就是堆了,没有左孩子和右孩子,他就直接是堆
完全二叉树中,所谓叶子结点为根,即左右孩子为空,这样的子树就已经是堆了,即所有的叶子结点都不需要调整了
从最后一个非叶子节点开始调整即可--在哪?怎么算?
根据性质:如果最后一个叶子结点为n,那他的双亲是n整除2,从他开始依次往前
如8是n/2-2
9是n/2-1
直到最后的根是1号位置的结点
堆其实也是一个线性表,用顺序存储法来存储--数组--研究那个算法都要知道怎么存
先按照它的序号1,2,3,4,5,6,7,8排在完全二叉树中,从上到下,从左到右
这就是初始的,无序的情况,我们先建一个初始的完全二叉树
位置和编号对应,
每一个叶子为根的子树都已经是堆了,都不用调整了,
从最后一个非叶子节点开始往前,4,3,2,1
数组中的元素也对应交换,对于这棵子树来说,他已经是小根堆了,
4号调整完后,到3号为根的子树了,从左右孩子里找一个小的和它交换
2号:n/2-2
左右孩子都比他大,那它就已经是一个小根堆了,不用调了
下一个:左右孩子里挑一个小的,同步的,实际上是在顺序表中交换
但是对于1号的子树还没有调整完,从根往下调整的元素必须调整到叶子才算完
49是3,那他的孩子是6和7,从这两个找小的交换,49就调整到叶子的地方了
最后整个无序的树变成小根堆了
看一下怎么实现:
从n/2一直到第一个结点,依次调整
sunshine2022要加油: 所以应该是4位对吧
flash9z: 本来就疑惑,看了你写的更疑惑了
德德德嘞: 小于0.5*10-3
九蚊纸: 你写错了
2301_81138134: 👍👍👍