首页 > 其他 > 详细

07_06.哈夫曼树

时间:2019-11-11 10:31:14      阅读:92      评论:0      收藏:0      [点我收藏+]

实数集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

技术分享图片

 

07_06.哈夫曼树

原文:https://www.cnblogs.com/fly-book/p/11832886.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!