實數集w={2, 3, 7, 10, 4, 2, 5},構造一棵哈夫曼樹node
在(2)中,存在兩個權值爲4的樹,能夠選擇其中任意一個與權值爲3的樹合併。不一樣選擇會致使不一樣的哈夫曼樹,但其外部路徑的長度必定相等。spa
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