## 算法导论6.1练习题

6.1-1 在高度为h的堆中,元素个数最多和最少分别是多少?
本题有一点需要注意,算法导论中对堆的高度定义和数据结构中不一样,算法导论中堆的高度是从叶节点到根节点的最长简单路径上边的数目。
最少元素个数是最后一层只有一个节点: 2^0+2 ^1+2 ^2 +…+ 2 ^(h-1)+1=2 ^h。
最多元素个数是一颗满二叉树: 2^0+2 ^1+2 ^2 +…+ 2 ^(h-1)+2 ^h=2 ^(h+1)-1。

6.1-2证明:含n个元素的堆的高度为⌊lgn⌋
证明:借用上一题的结论,则有2^h=<n<=2 ^(h+1)-1<2 ^(h+1),所以两边取对数则有:lgn-1<h<=lgn,所以h=⌊lgn⌋。

6.1-3证明:在最大堆的任一子树中,该子树所包含的最大元素在该子树的根节点上。
根据最大堆的定义有:A[PARENT(i)]>=A[i],所以最大元素一定在子树的根节点上面。

6.1-4假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于哪里?
因为最小元素一定没有孩子,否则违背最大堆的性质,所以最小元素在叶子节点上面。又因为叶子节点的元素没有直接进行比较,无法确定其顺序,则最小元素应位于最底层或者次底层的叶子节点上面。

6.1-5一个已排好序的数组是一个最小堆吗?
可能是最小堆,也可能是最大堆。
根据最小堆的性质A[PARENT(i)]<=A[i],很显然,顺序排的数组是一个最小堆。
则逆序排就是最大堆。

6.1-6值为<23,17,14,6,13,10,1,5,7,12>的数组是一个最大堆吗?
因为堆是一颗完全二叉树,所以在数组中严格的按照下标i,2i,2i+1来确定父子关系。显然i=4时,A[i]=6,而A[2*i+1]=7,违法了最大堆的性质。所以该数组不是一个最大堆。

6.1-7证明:当用数组表示存储n个元素的堆时,叶结点下标分别是⌊n/2⌋+1,⌊n/2⌋+2,…,n。
数组中的下标相当于给n个节点顺序编号,最后一个叶子节点编号为n,也就是说该节点的父节点是最后一个拥有孩子节点的节点,从该父节点之后都为叶子节点。因为父节点的小标为⌊n/2⌋,所以从⌊n/2⌋+1到n都为叶子节点。

猜你喜欢

转载自blog.csdn.net/demonandyu/article/details/85311349