python哈夫曼树_python霍夫曼树
class Node():
data=0
left=None
right=None
father=None
def __init__(self,data,left,right):
self.data=data
self.left=left
self.right=right
這里定義了一個Node類
聲明了左右結(jié)點和父節(jié)點,父節(jié)點是用來輸出霍夫曼編碼用的。
初始化構(gòu)造函數(shù),給數(shù)據(jù)和左右結(jié)點賦值,父節(jié)點不在這初始化,self的話和this關(guān)鍵字差不多
root=None
聲明根節(jié)點
def zhuanhuan( arr,index,n):
if index>=len(arr):
return None
else:
left=Node(arr[index],None,None)
num1=arr[index]+n.data
node=Node(num1,left,n)
left.father=node
n.father=node
if index==0:
index+=1
if index==len(arr)-1:
global root
root=node
zhuanhuan(arr,index+1,node)
這是一個轉(zhuǎn)換函數(shù),把數(shù)組轉(zhuǎn)化為霍夫曼樹,傳入的形參 arr是數(shù)組,index是下標(biāo),n是結(jié)點(定義結(jié)點是為了避免幾個結(jié)點斷節(jié))
如果index大于數(shù)組的長度,那么就退出
如果小于就繼續(xù)構(gòu)建霍夫曼樹
根據(jù)霍夫曼樹的構(gòu)建原理,傳入一個數(shù)組的值,把二者和的結(jié)點的傳入構(gòu)造函數(shù),遞歸,
left=Node(arr[index],None,None)
num1=arr[index]+n.data
node=Node(num1,left,n)
中間就是利用構(gòu)造函數(shù)初始化的代碼
left.father=node
n.father=node
把左右結(jié)點的父節(jié)點指向node
因為數(shù)組是從0開始到len(arr)-1
所以當(dāng)index滿足?if index==len(arr)-1:時
就定義一個全局root作為根節(jié)點
global? root
root=node
然后遞歸zhuanhuan(arr,index+1,node)
flag=False
v=[]
聲明一個標(biāo)志,定義一個bool型數(shù)組
for i in range(100):
v.append(False)
初始化100個False
輸出霍夫曼編碼函數(shù)
def show(n):
global flag 全局標(biāo)志
global arm 記錄個數(shù)的數(shù)組
global ard 記錄字符串不同的字符
if n!=None: 如果結(jié)點不為空
if (n.left==None and n.right==None)or flag==True://如果是葉子結(jié)點或者遍歷父節(jié)點
if v[n.data]!=True and(n.left==None and n.right==None)://如果葉子結(jié)點沒有輸出過
for i in range(len(arm))://把數(shù)字轉(zhuǎn)化為原來的字符碼比如a出現(xiàn)了4次那么在霍夫曼樹記錄的就是4,這個循環(huán)就是把4再轉(zhuǎn)化為a
if n.data==arm[i]:
print ard[i],":",
break
if n.father==None://如果父節(jié)點為空 那么就代表遍歷可以結(jié)束了
flag=False;
return
else://如果父節(jié)點不為空就繼續(xù)循環(huán)遍歷
flag=True標(biāo)志設(shè)為
show(n.father)//遍歷父節(jié)點
if n==n.father.right:如果是右子樹就輸出1
print 1," ",
else://如果是左子樹就輸出0
print 0," ",
else:如果不是葉子結(jié)點就遞歸遍歷霍夫曼樹
show(n.left)
show(n.right)
print "請輸入一段字符串:"
str=raw_input()
arr=[]#字符數(shù)組
arr=str
ard=[]//記錄有幾個不同字符的數(shù)組
for i in range(len(arr))://把不同的字符放入ard字符數(shù)組
flag=True
for j in range(len(ard)):
if ard[j]==arr[i]:
flag=False;
break
if flag!=False:
ard.append(arr[i])
arm=[]//權(quán)值數(shù)組
for i in range(len(ard))://更新權(quán)值
arm.append(0)
for i in range(len(arr)):
for j in range(len(ard)):
if arr[i]==ard[j]://每出現(xiàn)一次那個字符的權(quán)值層數(shù)組就自增1
arm[j]+=1;
break
for i in range(len(ard)-1)://插入排序
temp=ard[i+1]//記錄下一個數(shù)
temp1=arm[i+1]
j=i
while j>-1 and temp1
arm[j+1]=arm[j]
ard[j+1]=ard[j]
j-=1
arm[j+1]=temp1
ard[j+1]=temp
print "每一個元素的最小編碼為:",
zhuanhuan(arm,0,Node(arm[1],None,None))//把排序好的東西放入構(gòu)建霍夫曼樹
show(root)//遞歸輸出霍夫曼編碼
#生命本沒有意義,我們的存在就是賦予它意義
總結(jié)
以上是生活随笔為你收集整理的python哈夫曼树_python霍夫曼树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python学全栈还是运维_Python
- 下一篇: salt远程执行python脚本_Sal