1/5 堆
i/iii 基本结构
(二叉)堆是一个数组A[1 . . A.length],可以被看成一个近似的完全二叉树:除最底层外,该树是完全充满的,而且是从左向右填充。
树上的每一个节点对应数组中的一个元素,树的根节点为A[1]。
给定一个结点的下标 i ,可以得到:
父结点下标 Parent(i) :
⌊i2⌋
左孩子结点下标 Left(i) :
2∗i
右孩子结点下标 Right(i) :
2∗i+1
ii/iii 分类
最大堆:除了根以外的所有结点 i 都有
A[Parent(i)]≥A[i]
最小堆:除了根以外的所有结点 i 都有
A[Parent(i)]≤A[i]
iii/iii 基本性质
a/c.
在高度为h的堆中,元素个数最多和最少分别是多少 ?
最多:最底层全满
1+21+22+23+...+2h−1+2h=2h+1−1
最少:最底层只有一个结点
1+21+22+23+...+2h−1+1=2h
b/c.
含 n 个元素的堆的高度为
⌊lgn⌋
.
假设含 n 个元素的堆的高度为 h ,则
2h≤n≤2h+1−1
,两边取对数则有:
h≤lgn<h+1
故堆的高度为
⌊lgn⌋
.
c/c.
当用数组表示存储 n 个元素的堆时,叶结点下标分为为
⌊n2⌋
+1,
⌊n2⌋
+2,… , n.
最后一个叶结点N的下标为 n ,则其父结点P下标为
⌊n2⌋
.
若结点P右侧的结点含有孩子结点,则 N 就不是最后一个叶结点。
故P右侧的结点均为叶结点,即叶结点下标分为为
⌊n2⌋
+1,
⌊n2⌋
+2,… , n.