Appearance
题目
下列关于大根堆(至少含 个元素)的叙述中正确的是( )。
Ⅰ. 可以将堆看成一棵完全二叉树
Ⅱ. 可采用顺序存储方式保存堆
Ⅲ. 可以将堆看成一棵二叉排序树
Ⅳ. 堆中的次大值一定在根的下一层
错因
A
I 和 II 都判对,但漏掉了 IV。可能是凭直觉觉得"次大值不一定在根的下一层"——其实不然:堆里任何比根小的元素,能比根 "近"的位置只有根的两个孩子;如果次大值不在根的孩子位置,必然存在另一个比它大但不是根的元素,与"次大"矛盾。
B
把"堆"误等同于"二叉排序树"。两者结构都是二叉树但性质不同:BST 满足"左 < 根 < 右"的全序约束,中序遍历有序;而堆只满足"根 ≥ 孩子"(大根堆)的局部约束,中序遍历完全无序。选 III 是经典混淆。
D
错选 III(堆 ≠ BST)的同时漏选 II。漏 II 可能是受树的链式存储概念影响,认为堆这种树形结构应当用指针链接。其实堆是完全二叉树,正因如此才能用数组下标 算出父子位置(父 ,左孩子 ,右孩子 ),顺序存储既省空间又取址快——这恰恰是堆排序高效的物理基础。
总解析
逐条判断:
Ⅰ. 大根堆是完全二叉树。✓
堆的定义就是"满足堆性质的完全二叉树"。完全二叉树是除最后一层外每层都满、最后一层从左到右连续的二叉树。这是堆的结构基础。
Ⅱ. 堆可以顺序存储。✓
完全二叉树的天然优势:用一维数组按层序编号存储,下标 是根,下标 的父节点是 、左孩子是 、右孩子是 。无空隙、无指针开销,访问父子靠算术运算 O(1)。
Ⅲ. 堆是二叉排序树。✗
| 性质 | 大根堆 | 二叉排序树 |
|---|---|---|
| 约束方向 | 父 ≥ 子(局部) | 左 < 根 < 右(全局) |
| 中序遍历 | 无序 | 严格升序 |
| 兄弟之间大小 | 无约束 | 左子树 < 右子树 |
举个反例:大根堆 5(3, 4)(满足父 ≥ 子),但 BST 要求左 < 根 < 右,即左孩子 3 < 根 5 < 右孩子 4 —— 4 < 5 不满足。所以堆 ≠ BST。
Ⅳ. 大根堆中次大值一定在根的下一层。✓
证明:设根为 (最大值),次大值为 。
反设 不在根的下一层,即 不是根的孩子。那么 的父节点 既不是根、也不是 本身。
由大根堆性质,。又 是次大,意味着除根外没有比 大的元素,所以 。两式合得 。
但 和 是堆中不同位置上的两个元素( 是 的父亲),且堆中元素被视为可互不相等的关键字(408 默认情形),矛盾。
所以 必为根的孩子,即在根的下一层(第 2 层)。 ▢
注:若堆里允许有重复关键字,"次大值"通常仍指次大的位置,结论依然成立——次大位置至少有一个出现在根的下一层。
汇总:I、II、IV 正确,III 错误。
最终答案是 C(仅 Ⅰ、Ⅱ、Ⅳ)。
易错点排序:把"堆 = BST"是最常见错误(占了 B、D 两个错项);漏选 IV 居其次(占了 A)。考前默念一遍:"堆是完全二叉树、顺序存、根最大、次大在第二层"。