堆是一种特殊的完全二叉树(除了最后一层节点之外,其它层的节点必须是最大值),然后最后一层的节点必须集中在最左侧。
创建堆
把 n 个元素建立成一个堆,首先我可以将这 n 个节点以自顶向下,从左到右的方式从 1 到 n 编码。这样就可以把这 n 个节点转换成为一棵完全二叉树,紧接着从最后一个非叶节点(节点编号为 n/2)开始到根节点(节点编号为1)逐个扫描所有节点,根据需要将当前节点向下调整,直到以当前节点为根节点的子树符合堆的特性:
1 | // 从最后一个非叶结点到第1个结点依次进行向下调整 |
最大堆
所有父节点都比子节点要大:
1 |
|
最小堆
所有父节点都比子节点要小:
1 |
|