python实现哈夫曼树

这次是哈夫曼树,又叫最优二叉树,特点就是最大的在上面,小的在下面。

python实现哈夫曼树_第1张图片

建立步骤大概就是这样的,每次选两个2最小的建立一个然后加上去再做重复操作

现在我们来试着来写出哈夫曼树

首先需要定义一个节点类来保存节点信息,这个节点需要保存的信息包括:数值,左右孩子,是否已加入数中

class Node():
    def __init__(self,item):
        self.item=item
        self.isin=False
        self.left=None
        self.right=None

然后是哈夫曼树类,首先要解决的是,怎么做到每次从列表中选出最小的2个数

为了这个问题我专门又写了段代码来测试,设计和实现过程在这里

这里我们只关系类的实现,我们需要把所有节点都加入到节点列表中,不停遍历找出还未加入树中的

最小的2个节点,然后合成第三个点,这里怎么判断所有合并完成了呢?

根据哈夫曼树的性质,只有度数0和2节点,根据二叉树的性质有0度数(也就是叶子结点)比2度数的节点多1

所以总节点数是叶子结点的2*n-1倍,而叶子结点就是我们的初始节点

(感觉这部分描述起来太复杂,还是看代码直接点)

class HuffmanTree():
    def __init__(self,l):
        self.li=[]
        for x in range(0,len(l)):
            self.li.append(Node(l[x]))
        K=Node(float('inf'))
        while len(self.li)< 2*len(l)-1:
            m1=m2=K
            for x in range(0,len(self.li)):
                if m1.item>self.li[x].item and (self.li[x].isin is False):
                    m2=m1
                    m1=self.li[x]
                elif m2.item>self.li[x].item and (self.li[x].isin is False):
                    m2=self.li[x]

            H=Node(m1.item+m2.item)
            H.right=m1
            H.left=m2
            self.li.append(H)
            m1.isin=m2.isin=True
            print 'm1=%d m2=%d m1+m2=%d' % (m1.item,m2.item,H.item)

建议结合描述和代码来理解,我就是一边写的博客描述一边完成的代码,这样的好处在于能把实时的想法记录下来,光在脑子里想很容易理不清逻辑关系容易出错。

最后我们来测试下是否成功

if __name__=='__main__':
    L=[9,4,1,3,7,8,2,6]
    t=HuffmanTree(L)
    print 'success'

结果如下

python实现哈夫曼树_第2张图片

可以看到我们的哈夫曼树成功的建立了起来

你可能感兴趣的:(数据结构,python)