Appearance
题目
若二叉树的节点值均为正整数,采用顺序存储方式保存在数组 R 中,用 -1 表示节点不存在,则下列数组中,不能表示一棵二叉树的是()。
错因
A
担心下标 5 上的 35 之前出现两个 -1,误以为"前面有 -1 后面就不能再有数据"。这种紧凑规则只适用于完全二叉树的"压缩存储";本题用 -1 显式占位 = 通用顺序存储,下标和位置一一对应,关键看每个数据节点的父节点是否存在。35 在下标 5,父下标 (5−1)/2 = 2,R[2] = 40,父存在 → A 合法。
B
看着深、节点多,容易猜"非法"。但逐个核对:18 的父在下标 1(=40)✓;35 的父在下标 1(=40)✓;下标 5、6 的 -1 表示 10 没有子节点。整棵树是 15 为根、40 为左孩子(含 18、35 两个孩子)、10 为右孩子的合法形态。
C
下标 3、4、5 全是 -1 却在下标 6 出现 12,第一反应是"中间空了不合法"。但下标 6 对应"下标 2 处节点(= 10)的右孩子",10 真实存在 → 12 有合法父节点。下标 3、4 是 40 的左右孩子(说明 40 是叶);下标 5 是 10 的左孩子(说明 10 没有左孩子);下标 6 = 10 的右孩子(即 12)。结构成立。
总解析
思路:在 0 起始下标的顺序存储中,下标 节点的父节点位于 。合法性判据:每个非 -1 的数据节点都必须有一个非 -1 的父节点(根除外);如果出现"父是 -1 但孩子不是 -1",违反二叉树定义。
记下标 处的元素为 ,父下标为 。
A 验证:
| i | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| R[i] | 20 | 15 | 40 | -1 | -1 | 35 |
| 父下标 | — | 0 | 0 | 1 | 1 | 2 |
| 父值 | 根 | 20 ✓ | 20 ✓ | 15 ✓ | 15 ✓ | 40 ✓ |
每个数据节点的父都存在,合法。
B 验证:依次检查每个数据节点的父值(15、40、10),均存在 → 合法。
C 验证:12 在下标 6,父在下标 2,R[2] = 10 ✓;其他位置都是叶子或缺位 → 合法。
D 验证:
| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| R[i] | 17 | 20 | 35 | -1 | 18 | 45 | -1 | -1 | 19 | 27 |
| 父下标 | — | 0 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 |
| 父值 | 根 | 17 | 17 | 20 | 20 | 35 | 35 | -1 | -1 | 18 |
下标 8 的值是 19,但其父在下标 3,R[3] = -1(不存在)。没有父节点的孩子在二叉树中不允许存在——孩子必须挂在某个真实节点下,不能凭空冒出。
(下标 9 的 27 父在下标 4 = 18,本身合法,但 D 已被下标 8 的非法节点否定。)
最终答案是 D。