哈夫曼树的建立(二叉链表)
时间: 2023-07-01 15:22:06 浏览: 66
哈夫曼树是一种用于数据压缩的树形结构,它可以将一组数据压缩为尽可能短的二进制编码,从而节省存储空间。下面是哈夫曼树的建立过程(二叉链表实现):
1. 将待压缩的数据按照出现频率从小到大排序,并将每个元素看作一个节点。
2. 从排好序的节点中选取两个权值最小的节点,创建一个新节点,其权值为这两个节点的权值之和。将这个新节点插入到原来的节点序列中,并将这两个节点从序列中删除。
3. 重复步骤 2,直到只剩下一个节点,这个节点就是哈夫曼树的根节点。
4. 按照先左后右的顺序遍历哈夫曼树,将每个节点的编码记录下来。左子树的编码为 0,右子树的编码为 1。
下面是哈夫曼树建立的具体实现(假设有 n 个节点):
```python
# 定义哈夫曼树的节点类
class Node:
def __init__(self, value, freq):
self.value = value # 节点代表的值
self.freq = freq # 节点出现的频率
self.left = None # 左子节点
self.right = None # 右子节点
# 建立哈夫曼树函数
def build_huffman_tree(data):
# 创建 n 个节点,并将它们按照频率从小到大排序
nodes = [Node(value, freq) for value, freq in data.items()]
nodes.sort(key=lambda x: x.freq)
# 不断从序列中取出两个权值最小的节点,合并它们,并将新节点插入到序列中
while len(nodes) > 1:
left_node = nodes.pop(0)
right_node = nodes.pop(0)
new_node = Node(None, left_node.freq + right_node.freq)
new_node.left = left_node
new_node.right = right_node
nodes.append(new_node)
nodes.sort(key=lambda x: x.freq)
# 返回哈夫曼树的根节点
return nodes[0]
```
上述代码中,我们使用字典 data 来存储待压缩的数据,其中键为数据的值,值为出现的频率。在函数 build_huffman_tree 中,我们首先创建 n 个节点,并将它们按照频率从小到大排序。然后,我们不断从序列中取出两个权值最小的节点,合并它们,并将新节点插入到序列中,直到只剩下一个节点,这个节点就是哈夫曼树的根节点。最后,我们返回哈夫曼树的根节点。
阅读全文