07_06.哈夫曼樹

實數集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

相關文章
相關標籤/搜索