教材P147构造哈夫曼树,并且生成哈夫曼编码。编写程序,完成树构造、生成编码,见图1。给出程序代码,生成哈夫曼编码可以从叶子到根,也可以使用堆栈从树根开始遍历哈夫曼树(教材P148)。
时间: 2023-07-08 11:09:58 浏览: 94
好的,这是一个关于哈夫曼树的问题,我会尽力回答。以下是 Python 代码实现:
```python
# 定义哈夫曼树节点类,包括字符、频率和左右子树
class HuffmanNode:
def __init__(self, char=None, freq=0, left=None, right=None):
self.char = char
self.freq = freq
self.left = left
self.right = right
# 构造哈夫曼树函数
def build_huffman_tree(freq_dict):
nodes = [HuffmanNode(char=c, freq=f) for c, f in freq_dict.items()]
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.freq, reverse=True)
left_node = nodes.pop()
right_node = nodes.pop()
parent_node = HuffmanNode(freq=left_node.freq+right_node.freq, left=left_node, right=right_node)
nodes.append(parent_node)
return nodes[0]
# 生成哈夫曼编码函数
def generate_huffman_code(root):
code_dict = {}
stack = [(root, "")]
while stack:
node, code = stack.pop()
if node.char:
code_dict[node.char] = code
if node.left:
stack.append((node.left, code+"0"))
if node.right:
stack.append((node.right, code+"1"))
return code_dict
# 测试代码
if __name__ == "__main__":
freq_dict = {'a': 5, 'b': 2, 'c': 1, 'd': 4, 'e': 3}
root_node = build_huffman_tree(freq_dict)
code_dict = generate_huffman_code(root_node)
print(code_dict)
```
该程序首先定义了一个 `HuffmanNode` 类来表示哈夫曼树节点,包括字符、频率和左右子树。然后定义了 `build_huffman_tree` 函数来构造哈夫曼树,该函数接受一个字典作为输入,字典的键为字符,值为该字符在文本中出现的频率。函数首先根据频率构造叶子节点,然后将这些节点作为初始节点列表,循环进行以下操作:从节点列表中选取频率最小的两个节点作为左右子节点,生成一个新的父节点,将父节点加入节点列表中。最终生成的哈夫曼树即为根节点列表中的唯一节点,函数返回该节点。这个构造哈夫曼树的过程与教材上的描述相同。
接下来定义了 `generate_huffman_code` 函数来生成哈夫曼编码,该函数接受哈夫曼树的根节点作为输入。函数通过深度优先遍历哈夫曼树,将从根节点到每个叶子节点的路径表示为 0 或 1 的编码,保存在一个字典中,键为字符,值为该字符的编码。这个生成哈夫曼编码的过程与教材上的描述相同。
最后在 `main` 函数中定义了一个字典作为测试输入,然后调用 `build_huffman_tree` 和 `generate_huffman_code` 函数,最终输出生成的哈夫曼编码。
阅读全文