一,
#定义节点
class Node:
def __init__(self,weight=0,left=None,right=None):
self.weight=weight
self.left=left
self.right=right
#按权值排序
def sort(list):
return sorted(list,key=lambda Node:Node.weight)
#构建哈夫曼树
def great_huffman_tree(lis):
while len(lis)!=1:
new_node=Node(lis[0].weight+lis[1].weight,lis[0],lis[1])
del (lis[1]) #注意此行和下行 顺序,如果调换 列表删除的是 [0]位,移动后删除原[2]位
del (lis[0])
lis.append(new_node)
lis=sort(lis)
return lis[0]
#中序遍历
def traval(tree):
if tree==None : return
traval(tree.left)
print (tree.weight)
traval(tree.right)
if __name__=='__main__':
list=[]
for i in range(1,11): #添加结点
list.append(Node(i,None,None))
list=sort(list)
huffmantree=great_huffman_tree(list)
traval(huffmantree)
几个关键词:
1,结点的权: 即反应结点的重要性,数值越大代表重要性越大。
2,叶子结点 即 构建哈夫曼树的原结点,其他结点是此树的辅助结点 。
3,WPL (weighted path lengh) 树中所有叶结点的带路径长之和。
二, huffman tree 构建方法。
1,列表里放所有叶子结点,
2,选二个权值最小的结点组合成一棵树,左小,右大,新增一个父结点,
权值是二个子结点的和。
3, 删除列表里这二个最小的结点。
4,重复 2,3过程直至列表里只有一个值 ,此值就是 huffman tree.