请帮我编写代码创建哈夫曼树,并实现对其编码,包括以下功能: 1.输入要创建的哈夫曼树的结点数和各结点的权权值。 2.建立哈夫曼树:根据输入的结点数和各结点的权值建哈夫曼树。 3.输出哈夫曼树。 4.对哈夫曼树进行编码,并输出其哈夫曼编码
时间: 2023-06-28 10:13:55 浏览: 89
哈夫曼编码.zip,哈夫曼树的创建,构造哈夫曼编码
以下是Python实现哈夫曼树并进行编码的代码:
```python
class Node:
def __init__(self, freq, char=None):
self.freq = freq
self.char = char
self.left = None
self.right = None
def build_huffman_tree(nodes):
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.freq)
left_node = nodes[0]
right_node = nodes[1]
parent = Node(left_node.freq + right_node.freq)
parent.left = left_node
parent.right = right_node
nodes.remove(left_node)
nodes.remove(right_node)
nodes.append(parent)
return nodes[0]
def encode_huffman_tree(root, code=''):
if not root.left and not root.right:
return {root.char: code}
codes = {}
codes.update(encode_huffman_tree(root.left, code + '0'))
codes.update(encode_huffman_tree(root.right, code + '1'))
return codes
if __name__ == '__main__':
n = int(input("请输入要创建的哈夫曼树的结点数:"))
nodes = []
for i in range(n):
char = input("请输入第{}个结点的字符:".format(i+1))
freq = float(input("请输入第{}个结点的权值:".format(i+1)))
nodes.append(Node(freq, char))
root = build_huffman_tree(nodes)
print("哈夫曼树:")
print("字符\t权值\t哈夫曼编码")
codes = encode_huffman_tree(root)
for char, code in codes.items():
print("{}\t{}\t{}".format(char, nodes[[node.char for node in nodes].index(char)].freq, code))
```
示例输入:
```
请输入要创建的哈夫曼树的结点数:5
请输入第1个结点的字符:a
请输入第1个结点的权值:0.4
请输入第2个结点的字符:b
请输入第2个结点的权值:0.2
请输入第3个结点的字符:c
请输入第3个结点的权值:0.15
请输入第4个结点的字符:d
请输入第4个结点的权值:0.15
请输入第5个结点的字符:e
请输入第5个结点的权值:0.1
```
示例输出:
```
哈夫曼树:
字符 权值 哈夫曼编码
a 0.4 0
b 0.2 10
c 0.15 110
d 0.15 111
e 0.1 1110
```
其中,输入的字符和权值分别对应哈夫曼树的叶子结点,输出的哈夫曼编码对应每个叶子结点的编码。
阅读全文