版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第利用Python和C語言分別實(shí)現(xiàn)哈夫曼編碼temp=root.rchild;//后訪問右孩子
while(temp==NULL)//右孩子為空,代表左右孩子均已訪問,結(jié)點(diǎn)可以出棧
//結(jié)點(diǎn)出棧
root=pop(bs);
//尋到葉子結(jié)點(diǎn),可以得到結(jié)點(diǎn)中字符的編碼
if(root.c!='')
traverseStack(cs,root.c);
charPop(cs);//字符棧出棧
if(bs.top==bs.base)break;//根結(jié)點(diǎn)出棧,遍歷結(jié)束
//查看上一級(jí)結(jié)點(diǎn)是否訪問完左右孩子
root=getTop(bs);
temp=root.rchild;
if(bs.top!=bs.base)
//將結(jié)點(diǎn)右孩子設(shè)為空,代表已訪問其右孩子
root.rchild=NULL;
pop(bs);
push(bs,root);
//右孩子入棧
root=*temp;
push(bs,root);
//'1'入字符棧
charPush(cs,'1');
e解碼:
'''C
chardecode[100];//記錄解碼得到的字符串
//通過哈夫曼樹解碼
voiddecodeHuffman(TreeT,char*code)
intcnt=0;
Treeroot;
while(*code!='\0')//01編碼字符串讀完,解碼結(jié)束
root=T;
while(root-lchild!=NULL)//找到葉子結(jié)點(diǎn)
if(*code!='\0')
if(*code=='0')
root=root-lchild;
else
root=root-rchild;
code++;
elsebreak;
decode[cnt]=root-//葉子結(jié)點(diǎn)存放的字符即為解碼得到的字符
cnt++;
f主函數(shù):
'''C
voidmain()
pListpl=creatList();
printf("字符的權(quán)重如下\n");
for(pListl=pl;l-next!=NULL;l=l-next)
printf("字符%c的權(quán)重是%d\n",l-root-c,l-root-weight);
TreeT=creatHuffman(pl);
encodeHuffman(T);
printf("\n\n字符編碼結(jié)果如下\n");
for(inti=0;ii++)
printf("%c:%s\n",i+'a',stack[i]);
charcode[100];
printf("\n\n請(qǐng)輸入編碼:\n");
scanf("%s",code);
printf("解碼結(jié)果如下:\n");
decodeHuffman(T,code);
printf("%s\n",decode);
printf("\n\n");
system("date/T");
system("TIME/T");
system("pause");
exit(0);
1.2運(yùn)行結(jié)果
2.Python實(shí)現(xiàn)
2.1代碼說明
a創(chuàng)建哈夫曼樹:
#coding=gbk
importdatetime
importtime
frompip._patimportraw_input
#哈夫曼樹結(jié)點(diǎn)類
classHuffman:
def__init__(self,c,weight):
self.c=c
self.weight=weight
self.lchild=None
self.rchild=None
#創(chuàng)建結(jié)點(diǎn)左右孩子
defcreat(self,lchild,rchild):
self.lchild=lchild
self.rchild=rchild
#創(chuàng)建列表
defcreatList():
list=[]
list.append(Huffman('a',22))
list.append(Huffman('b',5))
list.append(Huffman('c',38))
list.append(Huffman('d',9))
list.append(Huffman('e',44))
list.append(Huffman('f',12))
list.append(Huffman('g',65))
returnlist
#通過列表創(chuàng)建哈夫曼樹,返回樹的根結(jié)點(diǎn)
defcreatHuffman(list):
whilelen(list)1:#列表只剩一個(gè)結(jié)點(diǎn)時(shí)循環(huán)結(jié)束,此結(jié)點(diǎn)即為哈夫曼樹的根結(jié)點(diǎn)
i=0
j=1
k=2
whileklen(list):#找到列表中權(quán)重最小的兩個(gè)結(jié)點(diǎn)list1,list2
iflist[i].weightlist[k].weightorlist[j].weightlist[k].weight:
iflist[i].weightlist[j].weight:
i=k
else:
j=k
k+=1
root=Huffman('',list[i].weight+list[j].weight)#新結(jié)點(diǎn)字符統(tǒng)一設(shè)為空格,權(quán)重設(shè)為list1與list2權(quán)重之和
iflist[i].weightlist[j].weight:#list1和list2設(shè)為新結(jié)點(diǎn)的左右孩子
root.creat(list[i],list[j])
else:
root.creat(list[j],list[i])
#list1數(shù)據(jù)域替換成新結(jié)點(diǎn),并刪除list2
list[i]=root
list.remove(list[j])
returnlist[0]
b編碼:
#通過哈夫曼樹編碼
defencodeHuffman(T):
code=[[],[],[],[],[],[],[]]
#列表實(shí)現(xiàn)棧結(jié)構(gòu)
treeStack=[]
codeStack=[]
treeStack.append(T)
whiletreeStack!=[]:#??沾肀闅v結(jié)束
root=treeStack[-1]
temp=root.lchild
whiletemp!=None:
#將結(jié)點(diǎn)左孩子設(shè)為空,代表已訪問其左孩子
root.lchild=None
#左孩子入棧
treeStack.append(temp)
root=temp
temp=root.lchild
#0入編碼棧
codeStack.append(0)
temp=root.rchild#后訪問右孩子
whiletemp==None:#右孩子為空,代表左右孩子均已訪問,結(jié)點(diǎn)可以出棧
root=treeStack.pop()#結(jié)點(diǎn)出棧
#尋到葉子結(jié)點(diǎn),可以得到結(jié)點(diǎn)中字符的編碼
ifroot.c!='':
codeTemp=codeStack.copy()
code[ord(root.c)-97]=codeTemp
iftreeStack==[]:#根結(jié)點(diǎn)出棧,遍歷結(jié)束
break
codeStack.pop()#編碼棧出棧
#查看上一級(jí)結(jié)點(diǎn)是否訪問完左右孩子
root=treeStack[-1]
temp=root.rchild
iftreeStack!=[]:
treeStack.append(temp)#右孩子入棧
root.rchild=None#將結(jié)點(diǎn)右孩子設(shè)為空,代表已訪問其右孩子
codeStack.append(1)#1入編碼棧
returncode
c解碼:
#通過哈夫曼樹解碼
defdecodeHuffman(T,strCode):
decode=[]
index=0
whileindexlen(strCode):#01編碼字符串讀完,解碼結(jié)束
root=T
whileroot.lchild!=None:#找到葉子結(jié)點(diǎn)
ifindexlen(strCode):
ifstrCode[index]=='0':
root=root.lchild
else:
root=root.rchild
index+=1
else:
break
decode.append(root.c)#葉子結(jié)點(diǎn)存放的字符即為解碼得到的字符
returndecode
d主函數(shù):
if__name__=='__main__':
list=creatList()
print("字符的權(quán)重如下")
foriinrange(len(list)):
print("字符{}的權(quán)重為:{}".format(chr(i+97),list[i].weight))
T=creatHuffman(list)
code=encodeHuffman(T)
print("\n字符編碼結(jié)果如下")
foriinrange(len(code)):
print(chr(i+97),end=':')
forjinrange(len(code[i])):
print(code[i][j],end='')
print("")
strCode=input("\n請(qǐng)輸入編碼:\n")
#哈夫曼樹在編碼時(shí)被破壞,必須重建哈夫曼樹
list=creatList()
T=creatHuffman(list)
decode=decodeHuffman(T,strCode)
print("解碼結(jié)果如下:")
foriinrange(len(decode)):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年環(huán)境評(píng)估(土壤環(huán)境質(zhì)量評(píng)估)試題及答案
- 2025年中職(醫(yī)學(xué)檢驗(yàn))血常規(guī)檢測(cè)實(shí)務(wù)綜合測(cè)試題及答案
- 2025年大學(xué)(測(cè)繪科學(xué)與技術(shù)專業(yè))地理信息系統(tǒng)基礎(chǔ)試題及答案
- 2025年大學(xué)第四學(xué)年(工程項(xiàng)目融資)融資方案設(shè)計(jì)階段測(cè)試題及答案
- 2025年大學(xué)美術(shù)學(xué)(美術(shù)學(xué)概論)試題及答案
- 2025年大學(xué)安全教育(交通安全知識(shí))試題及答案
- 2025年中職(市場開發(fā)實(shí)務(wù))客戶開發(fā)流程階段測(cè)試試題及答案
- 2025年中職船舶工程技術(shù)(船舶建造工藝)試題及答案
- 2025年中職道路橋梁工程技術(shù)(路橋施工技術(shù))試題及答案
- 2025年大學(xué)臨床醫(yī)學(xué)(臨床診療技術(shù))試題及答案
- 海南2025年中國熱帶農(nóng)業(yè)科學(xué)院橡膠研究所第一批招聘16人(第1號(hào))筆試歷年參考題庫附帶答案詳解
- 2025-2026人教版數(shù)學(xué)七年級(jí)上冊(cè)期末模擬試卷(含答案)
- 廣告行業(yè)法律法規(guī)與行業(yè)規(guī)范(標(biāo)準(zhǔn)版)
- 2026年國安民警副科級(jí)面試題及實(shí)戰(zhàn)解答
- 2026年紀(jì)檢監(jiān)察室工作面試題集
- 浙江省紹興市諸暨市2024-2025學(xué)年四年級(jí)上冊(cè)期末考試數(shù)學(xué)試卷(含答案)
- 廣東省廣州市天河區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末考試語文試題(含答案)
- 11340《古代小說戲曲專題》國家開放大學(xué)期末考試題庫
- 江蘇省淮安市淮陰區(qū)事業(yè)單位考試試題2025年附答案
- ups拆除施工方案
- GB/T 21196.4-2007紡織品馬丁代爾法織物耐磨性的測(cè)定第4部分:外觀變化的評(píng)定
評(píng)論
0/150
提交評(píng)論