Huffman树建立,右大左小
如arr = [(‘a’,15),(‘b’,8),(‘c’,6),(‘e’,5),(‘e’,3),(‘f’,1)]
Step1:根据values排序,生成:[(‘a’,15),(‘b’,8),(‘c’,6),(‘e’,5),(‘e’,3),(‘f’,1)]。
Step2: e,f值最小,从arr中取出,作左右孩子节点,e+f =4作为父节点(p1)。更新arr,重新排序;arr =[(‘a’,15),(‘b’,8),(‘c’,6),(‘e’,5),(‘p1’,4)]
Step3: 重复step2, b和p1值最小,作为左右孩子,e+p1 =9作为父节点(p2)。更新arr,重新排序;arr =[[(‘a’,15),(‘p2’,9),(‘b’,8),(‘c’,6)]
…
class Node():
def __init__(self,name=None,value=None):
self.name = name
self.value = value
self.right = None
self.left = None
class HuffmanTree():
def __init__(self,arr):
self.nodes = [Node(values[0],values[1]) for values in arr] #每个值生成node
while len(self.nodes)!= 1: #第一个作为root,所以不等于1
self.nodes.sort(key =lambda node:node.value, reverse= True) #step1
# step2
p = Node(value = (self.nodes[-1].value + self.nodes[-2].value)) #作为父节点
p.left = self.nodes.pop(-1)
p.right = self.nodes.pop(-1)
self.nodes.append(p)
self.root = self.nodes[0]
self.Code = list(range(10)) #用于储存编码的code,长度比数深度大就行
#生成Huffman编码
def HuffmanCode(self,tree,length):
node = tree
if (not node):
return
elif node.name:
result = str(node.name)+'的编码为:'
for i in range(length):
result += str(self.Code[i])
print(result)
return
self.Code[length] = 0
self.HuffmanCode(tree.left,length +1)
self.Code[length] = 1
self.HuffmanCode(tree.right,length+1)
def GenCode(self):
self.HuffmanCode(self.root,0)
if __name__=='__main__':
arr = [('a',15),('b',8),('c',6),('e',5),('e',3),('f',1)]
tree=HuffmanTree(arr)
tree.GenCode()
输出:
a的编码为:0
f的编码为:1000
e的编码为:1001
e的编码为:101
c的编码为:110
b的编码为:111