创建哈夫曼树,并实现对其编码,包括以下功能: 1.输入要创建的哈夫曼树的结点数和各结点的权值。 2.建立哈夫曼树:根据输入的结点数和各结点的权值建哈夫曼树。 3.输出哈夫曼树。 4.对哈夫曼树进行编码,并输出其哈夫曼编码。的代码
时间: 2023-09-10 09:05:13 浏览: 59
### 回答1:
以下是Python实现的哈夫曼树和编码的代码:
```python
class Node:
def __init__(self, value=None, weight=0):
self.value = value
self.weight = weight
self.left = None
self.right = None
def create_huffman_tree(nodes):
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.weight)
left_node = nodes.pop(0)
right_node = nodes.pop(0)
parent_node = Node(weight=left_node.weight+right_node.weight)
parent_node.left = left_node
parent_node.right = right_node
nodes.append(parent_node)
return nodes[0]
def huffman_encode(root, code_dict, code=''):
if not root:
return
if not root.left and not root.right:
code_dict[root.value] = code
huffman_encode(root.left, code_dict, code+'0')
huffman_encode(root.right, code_dict, code+'1')
# 测试代码
if __name__ == '__main__':
# 输入要创建的哈夫曼树的结点数和各结点的权值
n = int(input('请输入结点数:'))
nodes = []
for i in range(n):
value, weight = input(f'请输入第{i+1}个结点的值和权值,以空格分隔:').strip().split()
nodes.append(Node(value, int(weight)))
# 建立哈夫曼树
root = create_huffman_tree(nodes)
# 输出哈夫曼树
print(f'哈夫曼树:{root.value}({root.weight})')
queue = [(root.left, '0'), (root.right, '1')]
while queue:
node, code = queue.pop(0)
if node:
print(f'{code} -> {node.value}({node.weight})')
queue.append((node.left, code+'0'))
queue.append((node.right, code+'1'))
# 对哈夫曼树进行编码
code_dict = {}
huffman_encode(root, code_dict)
print('哈夫曼编码:')
for value, code in code_dict.items():
print(f'{value}: {code}')
```
示例输入:
```
请输入结点数:5
请输入第1个结点的值和权值,以空格分隔:a 10
请输入第2个结点的值和权值,以空格分隔:b 15
请输入第3个结点的值和权值,以空格分隔:c 12
请输入第4个结点的值和权值,以空格分隔:d 3
请输入第5个结点的值和权值,以空格分隔:e 4
```
示例输出:
```
哈夫曼树:None(44)
0 -> b(15)
1 -> None(29)
00 -> c(12)
01 -> a(10)
10 -> None(7)
100 -> d(3)
101 -> e(4)
哈夫曼编码:
a: 01
b: 00
c: 10
d: 100
e: 101
```
### 回答2:
创建哈夫曼树是一种用来实现数据压缩的技术。下面是一个实现对哈夫曼树编码的简单代码。
```python
class TreeNode:
def __init__(self, weight, value=None):
self.weight = weight
self.value = value
self.left = None
self.right = None
def create_huffman_tree(num_nodes, weights):
nodes = [TreeNode(weight) for weight in weights]
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.weight)
left_node = nodes.pop(0)
right_node = nodes.pop(0)
parent_node = TreeNode(left_node.weight + right_node.weight)
parent_node.left = left_node
parent_node.right = right_node
nodes.append(parent_node)
return nodes[0]
def output_huffman_tree(tree):
if tree is None:
return
output_huffman_tree(tree.left)
print(tree.weight, end=' ')
output_huffman_tree(tree.right)
def encode_huffman_tree(tree, code=''):
encoded_dict = {}
if tree is None:
return encoded_dict
if tree.value is not None:
encoded_dict[tree.value] = code
encoded_dict.update(encode_huffman_tree(tree.left, code+'0'))
encoded_dict.update(encode_huffman_tree(tree.right, code+'1'))
return encoded_dict
def main():
num_nodes = int(input("输入要创建的哈夫曼树的结点数:"))
weights = []
for i in range(num_nodes):
weight = int(input("输入第{}个结点的权值:".format(i+1)))
weights.append(weight)
huffman_tree = create_huffman_tree(num_nodes, weights)
print("哈夫曼树结构:")
output_huffman_tree(huffman_tree)
encoded_dict = encode_huffman_tree(huffman_tree)
print("\n哈夫曼编码:")
for key, value in encoded_dict.items():
print("{}: {}".format(key, value))
if __name__ == '__main__':
main()
```
这个代码中,我们首先通过`create_huffman_tree`函数创建哈夫曼树。然后使用`output_huffman_tree`函数输出哈夫曼树的结构。接下来,使用`encode_huffman_tree`函数对哈夫曼树进行编码,并使用循环输出哈夫曼编码。最后,通过`main`函数实现用户输入结点数和权值的功能。
注意:此代码仅作为一个简单示例,可能并不适用于所有情况。在实际应用中,可能需要考虑更多的错误处理和改进的算法实现。
### 回答3:
以下是一个实现哈夫曼树和编码的代码示例:
```python
import heapq
# 定义哈夫曼树的结点类
class HuffmanNode:
def __init__(self, value, freq):
self.value = value
self.freq = freq
self.left = None
self.right = None
# 用于比较结点权值
def __lt__(self, other):
return self.freq < other.freq
# 创建哈夫曼树的函数
def create_huffman_tree(node_count, node_weights):
# 将权值和结点初始化为哈夫曼树结点对象,并加入最小堆
min_heap = []
for i in range(node_count):
node = HuffmanNode(str(i), node_weights[i])
heapq.heappush(min_heap, node)
# 依次合并两个最小的结点,直到只剩下一个根结点
while len(min_heap) > 1:
left = heapq.heappop(min_heap)
right = heapq.heappop(min_heap)
parent = HuffmanNode(None, left.freq + right.freq)
parent.left = left
parent.right = right
heapq.heappush(min_heap, parent)
return heapq.heappop(min_heap)
# 输出哈夫曼树的函数
def print_huffman_tree(root):
if root is None:
return
print(f'Node: {root.value}, Freq: {root.freq}')
print_huffman_tree(root.left)
print_huffman_tree(root.right)
# 对哈夫曼树进行编码的函数
def encode_huffman_tree(root, code_dict, current_code=''):
if root is None:
return
if root.left is None and root.right is None:
code_dict[root.value] = current_code
encode_huffman_tree(root.left, code_dict, current_code + '0')
encode_huffman_tree(root.right, code_dict, current_code + '1')
# 主函数
def main():
node_count = int(input("请输入要创建的哈夫曼树的结点数:"))
node_weights = []
for i in range(node_count):
weight = int(input(f"请输入第{i+1}个结点的权值:"))
node_weights.append(weight)
root = create_huffman_tree(node_count, node_weights)
print("哈夫曼树:")
print_huffman_tree(root)
code_dict = {}
encode_huffman_tree(root, code_dict)
print("哈夫曼编码:")
for node, code in code_dict.items():
print(f'Node: {node}, Code: {code}')
if __name__ == "__main__":
main()
```
这段代码中,首先定义了一个`HuffmanNode`类来表示哈夫曼树的结点。然后,实现了一个`create_huffman_tree`函数来根据输入的结点数和权值建立哈夫曼树。接着,通过`print_huffman_tree`函数来输出哈夫曼树的结点和权值。最后,通过`encode_huffman_tree`函数来对哈夫曼树进行编码,将每个结点的哈夫曼编码存储在一个字典中。
在主函数中,首先询问用户要创建的哈夫曼树的结点数,并逐个询问各结点的权值。然后,调用`create_huffman_tree`函数建立哈夫曼树,再调用`print_huffman_tree`输出建立好的哈夫曼树。最后,调用`encode_huffman_tree`函数对哈夫曼树进行编码,并输出各结点的哈夫曼编码。