Skip to content

2021年 408 数据结构 第 5 题

数据结构2021年选择题2分

题目

若某二叉树有 5 个叶结点,其权值分别为 10、12、16、21、30,则其最小的带权路径长度(WPL)是( )。

错因

A

误把根的权值当 WPL。哈夫曼合并到最后剩一个根结点,权值是 89(= 所有叶子权值之和),这是哈夫曼树的"总和"而不是 WPL。WPL 要按"叶子权 × 路径长度"求和,不是简单相加叶子权。

C

贪心选择没回到候选集挑最小。每次合并后必须把新结点丢回候选集,再从所有候选里重新选两个最小。常见错法:把上一步合并结果直接和"还没合并过的下一个数"再合并,得到错误顺序。例如:10+12=22,然后误把 22+16=38(应回到 16, 21, 22, 30 中重选 16 和 21),后续 38+21=59、59+30=89,非叶结点权之和 22+38+59+89=208。

D

把所有结点(叶子+非叶子)的权值都加上。计算时不分清"WPL = 非叶子结点权值之和"这一公式;把 5 个叶子权值(10+12+16+21+30=89)和 4 个非叶子权值(22+37+52+89=200)一起加:89+200=289。叶子的权已经在父结点合并时累计过,不能再单独加。

总解析

思路:哈夫曼树是给定叶子权值后 WPL 最小的二叉树。构造法是反复挑选当前权值最小的两棵子树合并,直到合成一棵。WPL 有两种等价算法,第二种在选择题里更省时。

算法 1(定义法):WPL = ∑(叶子权 × 叶子到根的路径长度)。

算法 2(合并法):WPL = 所有非叶子结点的权值之和。原因:每个叶子的权在它所在的每一层向上合并时都被累加了一次,恰好等于路径长度倍。

构造哈夫曼树(贪心合并)

当前候选集(升序)选中合并新结点权操作后候选集
110 + 1222
216 + 2137
322 + 3052
437 + 5289

关键操作:每步合并后,新结点要重新放回候选集和其它原始权一起再排序,下一步从全集里挑最小两个。第 2 步要选的不是"上一步结果 22 + 下一个 16",而是"当前候选 {16, 21, 22, 30} 里最小的两个" → 16 和 21。

用算法 2 求 WPL

用算法 1 验证(哈夫曼树的层结构:30 在第 1 层下、22 在第 2 层下、{10, 12} 在第 3 层、{16, 21} 在第 2 层下、52 是 22 与 30 合并):

哈夫曼树形状(基于上面的合并顺序,最后一次合并 52 = 22 + 30 与 37 = 16 + 21 在同一层):

893716215222101230

各叶子的深度:

  • 16, 21:深度 2
  • 10, 12:深度 3
  • 30:深度 2

最终答案是 B(200)

小结:选择题里优先用"算法 2 = 非叶子权之和"省去画树和数深度。但如果题目要求画哈夫曼编码或问某一编码的长度,还是要还原树结构。

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数