实数集w={2, 3, 7, 10, 4, 2, 5},构造一棵哈夫曼树

在(2)中,存在两个权值为4的树,可以选择其中任意一个与权值为3的树合并。不同选择会导致不同的哈夫曼树,但其外部路径的长度一定相等。
from trees.prioqueue import PrioQueue # 优先队列 (较小数优先)
from trees.linktree import levelorder # 引入宽度优先遍历
class BinTNode:
"""二叉树结点"""
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
class HTNode(BinTNode):
"""哈夫曼树节点类"""
def __le__(self, othernode):
return self.data <= othernode.data
class HuffmanPrioQ(PrioQueue):
"""哈夫曼优先队列"""
def number(self):
return len(self._elems)
def HuffmanTree(weights):
trees = HuffmanPrioQ()
for w in weights:
trees.enqueue(HTNode(w))
while trees.number() > 1:
t1 = trees.dequeue()
t2 = trees.dequeue()
x = t1.data + t2.data
trees.enqueue(HTNode(x, t1, t2))
return trees.dequeue()
wlist = [2, 3, 7, 10, 4, 2, 5]
h = HuffmanTree(wlist)
print(levelorder(h)) # 33 14 19 7 7 9 10 3 4 4 5 2 2 None
