请构造一棵赫夫曼树并输出叶子节点的赫夫曼编码并写出完整代码
时间: 2024-12-22 14:33:00 浏览: 9
赫夫曼树,也称为最优二叉树或最小带权路径长度树,是一种自底向上的贪心算法生成的二叉树,用于给数据集合中的每个元素分配一个唯一的二进制编码,以便于后续高效地进行压缩存储。
构建赫夫曼树的过程通常涉及以下步骤:
1. 将数据项视为叶子节点,按照其权重值排序。
2. 取两个权重最小的节点合并成一个新的节点,新节点的权重是这两个节点的权重之和,然后将这个新节点插入到已排序的列表中。
3. 重复第2步,直到只剩下一个节点,这便是赫夫曼树的根节点。
对于叶子节点的编码规则是这样的:
- 新产生的节点总是左孩子为0,右孩子为1。
- 合并过程中,从底层开始,每次从左子树和右子树选取一个节点,记录它们的路径编码,即上一层节点的编码加上当前节点的标识(通常是左=0、右=1)。
以下是一个简单的Python代码示例,使用heapq库实现赫夫曼树构建,并输出叶子节点的赫夫曼编码:
```python
import heapq
def build_huffman_tree(weights):
heap = [[weight, [char, ""]] for char, weight in weights.items()]
heapq.heapify(heap)
while len(heap) > 1:
left_node = heapq.heappop(heap)
right_node = heapq.heappop(heap)
merged_weight = left_node[0] + right_node[0]
merged_char = '(' + left_node[1][1] + '|' + right_node[1][1] + ')'
heapq.heappush(heap, [merged_weight, merged_char])
return heap[0]
# 示例数据
weights = {"A": 1, "B": 5, "C": 9, "D": 14}
huffman_tree_root = build_huffman_tree(weights)
# 获取叶节点及其编码
leaves_and_codes = [(node[1][1], node[1][0]) for node in huffman_tree_root[1]]
print("Huffman Tree (leaf nodes and their codes):")
for code, char in leaves_and_codes:
print(f"{char}: {code}")
#
阅读全文