一句话解释哈夫曼树

哈夫曼树是一种特殊的二叉树,用于构建最优二叉树,以最小化叶子节点的总贡献,即每个叶子节点的权值乘以其深度。构建过程通过贪心策略,每次都选取权值最小的两个节点合并,新节点的权值为两子节点的权值之和。

一句话解释哈夫曼树

我们考虑对于一棵叶子节点有权值的二叉树,设其总共的贡献是每个叶子节点的权值乘上深度。

那么我们需要构造一个使其贡献最小的二叉树,也就被称作最优二叉树。

我们考虑贪心对于每次选择权值和最小的两个点进行合并,之后其父亲,权值为两个节点的权值和即可。

构造哈夫曼的过程是个**贪心算法**,核心思想是:**每次选择两个权值最小的结点合并,直到只剩**。这个过程能保证最终得到的二叉具有最小带权路径长度(WPL)。 --- ### ✅ 哈夫曼构造步骤(详细流程) 假设我们有组叶子结点的权值: $$ w_1, w_2, ..., w_n $$ #### 📌 步骤如下: 1. **初始化森林**:将每个权值看作个独立的二叉(只有根节点),组成个森林。 2. **排序**:将所有按根节点权值从小到大排序。 3. **合并**: - 取出权值最小的两棵 $ T_1 $ 和 $ T_2 $ - 创建个新的父结点,其权值为 $ w_1 + w_2 $ - 让 $ T_1 $ 作为左子,$ T_2 $ 作为右子 - 将新放回森林中 4. **重复步骤2~3**,直到森林中只剩 → 这就是哈夫曼! > ⚠️ 注意:非叶子结点都不是原始数据,只是中间合并结果。 --- ### ✏️ 示例:构造哈夫曼(以 {4,5,6,7,10,12,18} 为例) 原始权值集合:{4, 5, 6, 7, 10, 12, 18} 我们步步来: | 步骤 | 操作 | 合并 | 新结点 | |------|------|--------|--------| | 1 | 最小两个:4 和 5 | 4+5=9 | 加入:9 | | 2 | 当前集合:{6,7,9,10,12,18} → 最小:6,7 | 6+7=13 | 加入:13 | | 3 | 集合:{9,10,12,13,18} → 最小:9,10 | 9+10=19 | 加入:19 | | 4 | 集合:{12,13,18,19} → 最小:12,13 | 12+13=25 | 加入:25 | | 5 | 集合:{18,19,25} → 最小:18,19 | 18+19=37 | 加入:37 | | 6 | 集合:{25,37} → 合并 | 25+37=62 | 得到根节点 | 最终得到哈夫曼: ``` 62 / \ 25 37 / \ / \ 12 13 18 19 / \ / \ 6 7 9 10 / \ 4 5 ``` --- ### ✅ 构造技巧与注意事项 | 要点 | 说明 | |------|------| | 🔁 使用优先队列(最小堆) | 实现高效取最小值和插入新结点 | | 🌲 所有原始权值必须在叶子上 | 中间结点是合并生成的,不能是原始数据 | | ➕ 每个非叶结点必须有两个孩子 | 哈夫曼是“严格二叉”或“扩展二叉” | | 🔄 合并不唯 | 若有多个相同最小值,选择顺序不同可能导致结构不同,但 WPL 相同 | | 💯 WPL = 所有非叶子结点之和 | 即:9+13+19+25+37+62 = 165(快速验证方法) | --- ### 🧩 Python代码实现(带注释) ```python import heapq class TreeNode: def __init__(self, weight): self.weight = weight self.left = None self.right = None def build_huffman_tree(weights): # 创建优先队列(最小堆) heap = [] for w in weights: node = TreeNode(w) heapq.heappush(heap, (w, node)) # (权值, 节点) # 合并直到只剩 while len(heap) > 1: # 取出两个最小的 w1, n1 = heapq.heappop(heap) w2, n2 = heapq.heappop(heap) # 创建新父节点 parent = TreeNode(w1 + w2) parent.left = n1 parent.right = n2 # 放回堆中 heapq.heappush(heap, ((w1 + w2), parent)) # 返回根节点 root = heap[0][1] return root # 使用示例 weights = [4, 5, 6, 7, 10, 12, 18] root = build_huffman_tree(weights) print("哈夫曼已构建完成!") ``` > 这段代码会自动构造出符合要求的哈夫曼。 --- ### ✅ 总结:句话记住怎么构造 > **从小到大不断合并两个最小的,最后形成棵大,就是哈夫曼。** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值