【笔记】
堆是一棵完全二叉树,树的根为 A[ 1 ] ,给定某个节点的下标 i , 其父节点为 i/2 、左儿子为 i*2 、右儿子为 i*2+1。
二叉堆有两种,最大堆、最小堆(或称大根堆、小根堆)。大根堆中 A[ PARENT(i) ] >= A[ i ] , 最大元素在根部。
结点在根部的高度定义为从本结点到叶子的最长简单下降路径上边的数目。堆的高度为树的根的高度。
【练习】
6.1-1 在高度为h的堆中,最多和最少的元素个数是多少?
最多:
最少:
6.1-2 证明:含n个元素的堆的高度为 logn
6.1-3 证明:在一个最大堆的某棵子树中,最大元素在该子树的根上。
假设存在一个子树,其最大元素不在根上,设最大元素编号为 m ,则 A[ m ] >= A[ PARENT(m) ] 。
∵ 在最大堆上,A[ PARENT(i) ] >= A[ i ]
∴ A[ PARENT(m) ] >= A[ m ]
与假设矛盾,因此在一个最大堆的某棵子树中,最大元素在该子树的根上。
6.1-4 在一个最大堆中,假设其所有元素都不相同,那么其最小元素可能存在于堆的哪些地方。
当只有一个元素时,最小元素可能在根节点。
否则,最小元素只能在叶子结点上
由反正法,假设有最小元素不在叶子结点上,则其存在子结点 i。
∵ 所有元素都不相同,A[ PARENT(i) ] >= A[ i ]
∴ A[ PARENT(i) ] > A[ i ]
又∵ PARENT(i) 是最小的元素
∴ A[ PARENT(i) ] < A[ i ]
与假设矛盾,因此最小元素只能在叶子结点上。
6.1-5 一个已排好序的数组是一个最小堆吗?
给定数组 A 已按升序排列, 则 A[ i ] <= A[ j ] (i<j)
假设 i 为 A 中任意一元素,则A[ i/2 ]是 i 的父结点。
由于 A[ i ] <= A[ j ] (i<j),则 A[ i/2 ] <= A[ i ]
满足最小堆的性质 A[ PARENT(i) ] <= A[ i ],因此已排好序的数组是一个最小堆。
6.1-6 序列 <23,17,14,6,13,10,1,5,7,12> 是一个最大堆吗?
A[4] = 6 , A[RIGHT(4) = 9] = 7 。与最大堆的性质矛盾。
不是最大堆。
6.1-7 证明:当用数组表示存储了n个元素的堆时,叶子结点的下标是n/2+1,n/2+2....n。
当下标 i = n/2 时,若 n 为偶数,则 LEFT(i) = n,i 有一个子结点;若 n 为奇数,则RIGHT(i) = n,i有两个子结点。
当下标 i > n/2 时,LEFT(i)、RIGHT(i) 皆大于n,因此 i 没有子结点,i 是叶子结点。