408真题解析-2010-6-数据结构-哈夫曼树
一 真题2010-6
2010-06. 对 nnn( n≥2n≥2n≥2 )个权值均不相同的字符构造哈夫曼树。下列关于该哈夫曼树的叙述中,错误的是( )。
A. 该树一定是一棵完全二叉树
B. 树中一定没有度为 1 的结点
C. 树中两个权值最小的结点一定是兄弟结点
D. 树中任一非叶结点的权值一定不小于下一层任一结点的权值
二 题目要素解析
核心概念 :哈夫曼树(Huffman Tree)
- 定义:带权路径长度(WPL)最小的二叉树,也称最优二叉树。
- 构造规则:每次从森林中选取两个权值最小的节点,合并为一个新节点(新节点权值为两者之和),新节点作为它们的父节点。
结构特征:
- 哈夫曼树中只有度为 0(叶子)和度为 2(非叶)的节点。
- 包含 n 个叶子节点的哈夫曼树,其总结点数为 2n−1。
选项分析目标:找出不符合哈夫曼树性质的描述。
三 哔哔详解
Step 1:回顾哈夫曼树的构造规则
-
将每个字符视为一棵只有根节点的二叉树,权值为字符频率。
-
每次从森林中选出
两棵根节点权值最小的树
,合并为一棵新树:
- 新树的根权值 = 两子树权值之和
- 两子树分别作为新树的左右孩子
-
重复直到只剩一棵树 → 即哈夫曼树。
✅ 关键特性:
- 每次合并两个节点 → 所有内部节点都有两个孩子
- 因此,不存在度为 1 的节点
Step 2:逐项分析选项
A. 该树一定是一棵完全二叉树 ❌(错误)
-
完全二叉树定义:除最后一层外,其他层全满;最后一层节点靠左排列。
-
哈夫曼树 ≠ 完全二叉树!
-
反例
:设权值为 {1, 2, 3, 4}
-
合并 1+2=3 → 新森林:{3, 3, 4}
-
合并 3+3=6 → 新森林:{4, 6}
-
合并 4+6=10
-
最终树结构:
10 / \ 6 4/
3 3
/
1 2
-
或等价结构,但不可能是完全二叉树(如第3层只有3个节点,且分布不对称)。
→ A 错误,是本题答案
B. 树中一定没有度为 1 的结点 ✅(正确)
- 哈夫曼树由两两合并生成
- 每个内部节点都是由两个子树合并而来 → 必有两个孩子
- 叶子节点度为 0
- 所以不存在度为 1 的节点
→ B 正确
C. 树中两个权值最小的结点一定是兄弟结点 ✅(正确)
- 由于权值互不相同,最小的两个权值在第一步就被选中合并
- 合并后成为同一父节点的左右孩子 → 互为兄弟
- 即使后续被更高层合并,它们的父子关系不变
→ C 正确
📌 注意:若权值可重复,则可能不是兄弟,但本题明确"权值均不相同"
D. 树中任一非叶结点的权值一定不小于下一层任一结点的权值 ✅(正确)
- 非叶节点的权值 = 其子树中所有叶子权值之和
- 子树中任意节点(包括下一层的内部节点或叶子)的权值 ≤ 该子树总权值
- 因为所有权值 > 0,所以:
父节点权值=左子权值+右子权值≥max(左子权值,右子权值)父节点权值=左子权值+右子权值≥max(左子权值,右子权值)
- 故非叶节点权值 ≥ 其直接子节点权值
- 递推可知:非叶节点权值 ≥ 下一层任意节点权值
→ D 正确
四 参考答案
参考答案 A
五 考点精析
5.1 哈夫曼树定义及基本特征
1. 定义
-
哈夫曼树 (最优二叉树):给定 nn 个带权叶子节点,构造一棵二叉树,使其 带权路径长度(WPL)最小。
-
带权路径长度(WPL):
WPL=∑i=1nwi⋅li\text{WPL} = \sum_{i=1}^{n} w_i \cdot l_iWPL=i=1∑nwi⋅li
-
wiw_iwi:第 iii 个叶子的权值(如字符频率)
-
lil_ili :该叶子到根的路径长度 (通常指边数)
✅ 目标:高频字符路径短 → 编码短 → 压缩效率高
二、核心性质特征
| 性质 | 说明 |
|---|---|
| 1. 无度为 1 的节点 | 所有内部节点均由两个子树合并而成 → 度为 2 |
| 2. 叶子数 = n ,总节点数 = 2n−1 | n 个叶子 + (n−1) 个内部节点 |
| 3. 最小两个权值必为兄弟(权值互异时) | 构造第一步即合并它们 |
| 4. 非叶节点权值 ≥ 子节点权值 | 因其权值 = 子树权值之和 |
| 5. 不一定是完全/满二叉树 | 结构由权值分布决定,可能高度不平衡 |
| 6. WPL 唯一,但树结构可能不唯一 | 当有权值相同时,合并顺序可不同 |
5.2 WPL 计算
方法 1:按叶子计算(定义法)
WPL=∑(叶子权值×深度) \text{WPL} = \sum (\text{叶子权值} \times \text{深度}) WPL=∑(叶子权值×深度)
深度 = 从根到该叶子的边数
方法 2:按内部节点累加(推荐!)
- 每次合并的代价 = 两子树权值之和
- WPL = 所有合并操作的代价之和
✅ 示例:
权值:{1, 2, 3, 4}
- 合并 1+2 = 3 → 代价 3
- 合并 3+3 = 6 → 代价 6
- 合并 4+6 = 10 → 代价 10
→ WPL = 3 + 6 + 10 = 19
💡 此法无需画树,直接累加中间结果,408 快速解题首选
5.3 哈夫曼树构造步骤(贪心算法)
5.3.1 口诀
- 构造森林全是根;
- 选用两小造新树;
- 删除两小添新人;
- 重复2、3剩单根。
5.3.2 详细步骤
初始化:将 n 个权值分别作为 n 棵只有根节点的二叉树(森林)。
选最小 :在森林中选取两棵根节点权值最小的树。
合并:将这两棵树合并为一棵新树。
- 新树根节点的权值 = 两棵子树根节点权值之和。
- 谁权值小谁作为左子树(习惯做法,也可反之,但需保持一致),权值大的作为右子树。
更新:在森林中删除这两棵旧树,加入这棵新树。
循环:重复步骤 2-4,直到森林中只剩下一棵树为止。这棵树就是哈夫曼树。
5.4 哈夫曼编码
- 前缀编码:没有任何一个编码是另一个编码的前缀(保证解码时不会产生歧义)。
- 编码规则:
- 规定哈夫曼树中,左分支代表 '0',右分支代表 '1'(也可以反过来,但必须统一)。
- 从根节点出发,到某一叶子节点的路径上的 0/1 序列,即为该叶子节点的哈夫曼编码。
- 特点:
- 哈夫曼编码是前缀编码。
- 哈夫曼编码是最优前缀编码(平均编码长度最短)。
✅ 示例(权值 {1:a, 2:b, 3:c, 4:d}):
(10)
/ \
(6) d(4)
/ \
c(3) (3)
/ \
a(1) b(2)
- a: 010
- b: 011
- c: 00
- d: 1
平均码长=1×3+2×3+3×2+4×11+2+3+4=1910=1.9\text{平均码长} = \frac{1 \times 3 + 2 \times 3 + 3 \times 2 + 4 \times 1}{1 + 2 + 3 + 4} = \frac{19}{10} = 1.9平均码长=1+2+3+41×3+2×3+3×2+4×1=1019=1.9
✅ 说明:
- 分子:各字符权值 × 编码长度(即路径长度)之和 → 等于 WPL
- 分母:所有字符权值之和(即总频率)
- 平均码长 = WPL / 总权值
六 考点跟踪
| 年份 | 题号 | 考查内容 | CSDN 参考链接 | VX参考链接 |
|---|---|---|---|---|
| 2010 | 第6题 | 哈弗曼树基本特征 | ||
| 2015 | 第3题 | 根据结点权值判断是否为哈夫曼树 | ||
| 2021 | 第5题 | 最小带权路径长度 |
说明 :本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书 中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。