#建立節點類,用於每個節點的生成
class
hfmnode()
: def __init__
(self)
: self.name = none
self.weight = none
self.leftchild = none
self.rightchild = none
self.parent = none
#構建哈夫曼樹
def creattree
(data)
: #將傳入的資料字典,key和value對換,便於後面使用
new_dict =
#生成權重列表,用於後面生成哈夫曼樹
weight=
[i for i in new_dict ]
#生成節點字典,用於儲存各個節點,key為每個節點權重,value為對應節點
#節點屬性填入name屬性和weight屬性
node_dict=
for i in new_dict:
node=
hfmnode()
node.name=new_dict[i]
node.weight=i
node_dict[i]
=node
#構建哈夫曼樹,直到只剩乙個根節點結束構建
#每兩個權重最小節點生成乙個父節點
while
len(weight)!=1
: #找到最小兩個權重節點,在權重列表中去除
min1=
min(weight)
weight.
remove
(min1)
min2=
min(weight)
weight.
remove
(min2)
#生成父節點
#父節點左孩子為最小權重節點,右孩子為倒數第二權重節點
#父節點權重為兩個孩子權重和
parentnode=
hfmnode()
parentnode.leftchild=node_dict[min1]
parentnode.rightchild=node_dict[min2]
parentnode.weight=min1+min2
#將兩個孩子的parent屬性都設為該父節點
node_dict[min1]
.parent=parentnode
node_dict[min2]
.parent=parentnode
#將父節點權重加入權重列表,並在節點字典中生成對應資料(key為權重,value為節點)
weight.
(parentnode.weight)
node_dict[parentnode.weight]
=parentnode
return parentnode
#哈夫曼樹解碼
#利用遞迴進行解碼
def hfmcode
(tree,code=
"",dict=):
#若左孩子存在,code加1
,若退出該左孩子,則將code最後乙個減去
if tree.leftchild:
code=code+
"1" dict=
hfmcode
(tree.leftchild,code,dict)
code=code[0:
-1] #與上述相同
if tree.rightchild:
code=code+
"0" dict=
hfmcode
(tree.rightchild,code,dict)
code=code[0:
-1] #若左右孩子不存在,說明到達根節點
#儲存當前節點的屬性及編碼
if tree.leftchild == none and tree.rightchild == none:
dict[tree.name]
=code
return dict
data=
tree=
creattree
(data)
print
(hfmcode
(tree)
)
哈夫曼樹與哈夫曼編碼
在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...
哈夫曼樹與哈夫曼編碼
1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...
哈夫曼樹與哈夫曼編碼
哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...