数据结构中的树、堆与二叉树详解
堆的概念与构建
堆是一种特殊的完全二叉树,在这个树结构里,每个顶点都具备堆序属性,即顶点存储的值大于或等于其所有后代节点存储的值。将任意完全二叉树转化为堆的步骤如下:
1. 所有叶子节点天然满足堆序属性,所以以叶子节点为根的子树都是堆。
2. 从倒数第二层最右侧的内部顶点开始,从右向左、从下向上处理。若顶点不满足堆序属性,就把它的值和其最大子节点的值交换,然后对修改后的顶点重复此操作,直至以该顶点为根的子树成为堆。
由于可以通过将子树根节点向下交换到合适位置的方式把每个子树转化为堆,所以将完全二叉树转化为堆的效率较高。完全二叉树的高度为 $\lfloor\lg n\rfloor$,这使得该操作耗时不会太长。
堆可以有多种实现方式,但因其是完全二叉树,所以能高效地存储在连续的内存位置中。通过特定的编号方案,能为完全二叉树的每个顶点编号,编号规则是从左到右、从上到下。具体规则如下:
|关系|规则|
| ---- | ---- |
|顶点 k 的左子节点|顶点 2k + 1|
|顶点 k 的右子节点|顶点 2k + 2|
|顶点 k 的父节点|顶点 $\lfloor(k - 1) / 2\rfloor$|
|若树中有 n 个顶点,最后一个有子节点的顶点|顶点 $\lfloor n / 2\rfloor - 1$|
若把这些顶点编号作为数组索引,就能在数组中存储树顶点的值,实现完全二叉树在数组中的表示,且不会浪费数组空间。
堆排序算法
基于堆可以实现一种高效且有趣的排序算法——堆排序。具体步骤如下:
1.
超级会员免费看
订阅专栏 解锁全文

987

被折叠的 条评论
为什么被折叠?



