用Python代码实现编写一个程序,构造哈夫曼树和哈夫曼编码,要求输出建立的哈夫曼树和相关的哈夫曼编码
时间: 2024-05-14 16:15:39 浏览: 114
hafuman.rar_Huffman coding_hafuman_huffman_哈夫曼树_哈夫曼树 编码
好的,以下是Python代码实现哈夫曼树和哈夫曼编码的程序:
```
class Node:
def __init__(self, value, freq):
self.value = value
self.freq = freq
self.left = None
self.right = None
def build_huffman_tree(characters, freqs):
nodes = []
for i in range(len(characters)):
node = Node(characters[i], freqs[i])
nodes.append(node)
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.freq)
left_node = nodes.pop(0)
right_node = nodes.pop(0)
parent_node = Node(None, left_node.freq + right_node.freq)
parent_node.left = left_node
parent_node.right = right_node
nodes.append(parent_node)
return nodes[0]
def build_huffman_code(node, current_code, huffman_code):
if node is None:
return
if node.value is not None:
huffman_code[node.value] = current_code
return
build_huffman_code(node.left, current_code + "0", huffman_code)
build_huffman_code(node.right, current_code + "1", huffman_code)
# Test example
characters = ['a', 'b', 'c', 'd', 'e', 'f']
freqs = [45, 13, 12, 16, 9, 5]
huffman_code = {}
root_node = build_huffman_tree(characters, freqs)
build_huffman_code(root_node, "", huffman_code)
print("Huffman tree:")
print("Root node frequency:", root_node.freq)
print("Left sub-tree frequency:", root_node.left.freq)
print("Right sub-tree frequency:", root_node.right.freq)
print("\nHuffman codes:")
for char, code in huffman_code.items():
print(char, ":", code)
```
程序输入两个列表: `characters` 和 `freqs`,分别表示字符和对应的频率。程序首先将每个字符和其对应的频率封装为节点对象,并将这些节点添加到一个列表中。然后,程序循环执行以下步骤:
1. 对节点列表按照频率排序。
2. 从节点列表中弹出两个频率最小的节点,并合并这两个节点,构造一个父节点。
3. 将该父节点添加到节点列表中。
4. 重复步骤 1-3 直至只剩下一个节点,该节点就是哈夫曼树的根节点。
接着,程序调用 `build_huffman_code` 函数构建哈夫曼编码。该函数使用先序遍历方式遍历哈夫曼树,对每个叶子节点生成一个Huffman编码,Huffman编码是由0和1组成的字符串,左子树的节点得到的编码为0,右子树的节点得到的编码为1。
最后,程序输出构建的哈夫曼树信息和生成的哈夫曼编码信息。
阅读全文