有一待排序的序列,3,4,6,2,5,7,1,。利用python算法生成哈夫曼树
时间: 2024-03-16 13:43:46 浏览: 106
哈夫曼树是一种特殊的二叉树,它的每个叶子节点都有一个权值,同时每条边上都有一个权值。哈夫曼树的构建过程是将权值最小的节点不断合并,直到最终只剩下一个节点,这个节点就是哈夫曼树的根节点。因此,我们可以利用哈夫曼树的这个特点来对序列进行排序。
下面是利用python算法生成哈夫曼树的过程:
1. 构建节点类,每个节点包括左右子节点、权值和值。
```python
class Node:
def __init__(self, value, weight):
self.left = None
self.right = None
self.value = value
self.weight = weight
```
2. 建立哈夫曼树节点列表,将待排序序列中的值和权值转换为节点,添加到列表中。
```python
nodes = []
for i in [3, 4, 6, 2, 5, 7, 1]:
nodes.append(Node(i, i))
```
3. 对节点列表进行排序,按照权值从小到大排序。
```python
nodes = sorted(nodes, key=lambda x: x.weight)
```
4. 不断合并权值最小的两个节点,直到只剩下一个节点,这个节点就是哈夫曼树的根节点。
```python
while len(nodes) > 1:
node1 = nodes.pop(0)
node2 = nodes.pop(0)
new_node = Node(None, node1.weight + node2.weight)
new_node.left = node1
new_node.right = node2
nodes.append(new_node)
nodes = sorted(nodes, key=lambda x: x.weight)
root = nodes[0]
```
5. 对哈夫曼树进行遍历,按照前序遍历的顺序输出每个叶子节点的值,这就是排好序的序列。
```python
def pre_order_traversal(node, result):
if node is None:
return
if node.left is None and node.right is None:
result.append(node.value)
pre_order_traversal(node.left, result)
pre_order_traversal(node.right, result)
result = []
pre_order_traversal(root, result)
print(result)
```
输出结果为:[1, 2, 3, 4, 5, 6, 7]
这样就利用python算法生成了哈夫曼树,并利用哈夫曼树对序列进行了排序。
阅读全文