这次是哈夫曼树,又叫最优二叉树,特点就是最大的在上面,小的在下面。
建立步骤大概就是这样的,每次选两个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'
结果如下
可以看到我们的哈夫曼树成功的建立了起来