Appearance
题目
下列选项给出的是从根分别到达两个叶结点路径上的权值序列,能属于同一棵哈夫曼树的是( )。
错因
A
只看到两条路径上的"24, 10"开头一致,就当成两条路径共用根 24 → 子 10 这条边。但要进一步检查 10 的孩子:第一条要求 10 的某个孩子是 5,则另一孩子 = ;第二条要求 10 的某个孩子是 7,则另一孩子 = 。同一个 10 节点不可能既有孩子 (5,5) 又有孩子 (7,3)。矛盾。
B
24 = 10 + 14(这是 24 唯一可能的孩子组合,要让另一边能下接合法路径)。第一条路径的 24 → 10 没问题;第二条路径出现了 24 → 12,意味着 24 的某个孩子是 12 而不是 10/14——同一个 24 节点的两个孩子是固定的,不可能同时出现 "10" 和 "12"。 也直接说不通。
C
24 = 10 + 14 ✓。但第一条路径 10 → 10 要求 10 的某个孩子是 10,则另一个孩子 = 。哈夫曼树的叶子(原始字符)权值都是正数,构造过程中产生的内部节点权值也是正数和,不可能出现 0。所以"父=子"在哈夫曼树里不成立——一旦出现,"另一孩子=0"就违法。
总解析
哈夫曼树的两条铁律:
- 每个内部节点的权值 = 其两个孩子节点权值之和(构造时合并最小两棵子树得到)。
- 所有节点权值都是正数(叶子是原始字符权,内部是正数和)。
任意一条 "根 → 叶" 路径上的权值序列,相邻两个数 (父 , 子 ) 必须满足:父节点的另一个孩子权值 。
逐项检验:
| 选项 | 关键检查点 | 结果 |
|---|---|---|
| A | 两路径都是 24 → 10。同一个 10 节点的另一孩子 = (路径 1 推),又 = (路径 2 推),冲突 | ❌ |
| B | 24 的孩子既要是 10 又要是 12,但 ,且任一节点只有 2 个孩子 | ❌ |
| C | 24 → 10 → 10:10 的另一孩子 = ,违反"权值为正" | ❌ |
| D | 24 → 10 → 5:10 的另一孩子 = 5(5+5=10 ✓),24 的另一孩子 = 14;24 → 14 → 6:14 的另一孩子 = 8(6+8=14 ✓)。全部自洽 | ✅ |
D 对应的合法子结构(仅画出题目涉及的两条路径相关部分,节点数字为权值):
解题套路:拿到选项后从根权值出发,每往下走一层就用 "父−子=另一子" 推出兄弟权值。一旦出现 ≤ 0、或两条路径推出的同一节点孩子矛盾,就排除。这类题不需要构造完整哈夫曼树,只校验局部约束就够了。
最终答案是 D(24, 10, 5 和 24, 14, 6)。