哈夫曼樹與哈夫曼編碼的實現 python

2021-10-12 12:39:18 字數 2203 閱讀 8337

#建立節點類,用於每個節點的生成

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的值的和則是這個節點的值,根節點是...