版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)4.2最優(yōu)二叉樹(哈夫曼樹)、實(shí)驗(yàn)的目的要求1、了解樹和哈夫曼樹的特性,以及它們在實(shí)際問題中的應(yīng)用。2、掌握樹和哈夫曼樹的實(shí)現(xiàn)方法以及它們的基本操作,學(xué)會運(yùn)用樹和二叉樹來解決問 題。、實(shí)驗(yàn)的主要內(nèi)容1、請?jiān)O(shè)計(jì)一個算法,對于給定的n個結(jié)點(diǎn)的權(quán)值,建立一棵哈夫曼樹。 具體要求如下: 算法輸入:n個結(jié)點(diǎn)的權(quán)值。 算法輸出:哈夫曼樹,打印出哈夫曼樹的所有的結(jié)點(diǎn)序號、雙親結(jié)點(diǎn)、左孩子、右孩 子和權(quán)值。 測試數(shù)據(jù):設(shè)結(jié)點(diǎn)數(shù)n=7,權(quán)值分別為7、5、2、3、8、10、20 ;設(shè)結(jié)點(diǎn)數(shù)n=8,權(quán)值分別為 7、19、2、6、32、3、21、10。三、解題思路圖5-L哈夫曼啊示世圖1、 哈夫曼樹的存儲結(jié)構(gòu):用
2、哈夫曼算法求得的哈夫曼樹中共有 2n-l個結(jié)點(diǎn),其中n個葉結(jié)點(diǎn)是初始森林中的n個孤立結(jié)點(diǎn),其余 n-1個結(jié)點(diǎn)是構(gòu)造過程中生成的度為2的結(jié)點(diǎn)。因此,有2n-l個結(jié)點(diǎn)的哈天曼樹可用大小為2n-l的向量來存儲。每個結(jié)點(diǎn)包括4個域:權(quán)值域、左/右孩子域和雙親域,雙親域不但可用來存放雙親在向量中的下標(biāo),而且可區(qū)分該結(jié)點(diǎn)是否為根結(jié)點(diǎn)。因?yàn)樵诋?dāng)前森林中合并兩棵二叉樹時,必須在森林的所有結(jié)點(diǎn)中先取兩個權(quán)值最小的根結(jié)點(diǎn),所以有必要為每個結(jié)點(diǎn)設(shè)置一個標(biāo)記以區(qū)分根和非根結(jié)點(diǎn)。2、解題步驟如下: 將哈天曼樹向量tree中的2n-l個結(jié)點(diǎn)初始化:即將各結(jié)點(diǎn)中的三個指針和權(quán)值均置 為0。 讀入n個權(quán)值放入向量tree的前
3、n個分量中,它們是初始森林中的n個孤立的根結(jié)點(diǎn)上的權(quán)值。 對森林中的樹進(jìn)行n I次合并,共產(chǎn)生 n I個新結(jié)點(diǎn),依次放入向量tree的第t個分量中(n+l wtw m)(第t個分量的下標(biāo)值為t 一 I)。每次合并的方法如下:在當(dāng)前森林的所有結(jié)點(diǎn)treej(O j i 一 l, i=t-l)中,選取具有最小權(quán)值和次小權(quán)值的兩個根結(jié)點(diǎn),分別用pl和p2記住這兩個根結(jié)點(diǎn)在向量tree中的下標(biāo)。將根為treepl和treep2的兩棵樹合并,使其成為新結(jié)點(diǎn)treei的左右孩子,得到一 棵以新結(jié)點(diǎn)treei為根的二叉樹。同時修改treepl和treep2的雙親域,使其指向新結(jié)點(diǎn)treei,這意味著它們在當(dāng)
4、前森林中已不再是根,將treepl和treep2的權(quán)值相加后,作為新結(jié)點(diǎn)treei的權(quán)值。05-2哈夭曼樹的三叉鏈表存儲形式示盍圖四、原程序清單c+程序#in clude#in clude#in cludeusing n amespace std;#defi ne MAXVAL 10000000 typedef int datatype;typedef structdouble weight;int num;datatype lchild,rchild,pare nt; htree;htree tree100;int n, m,flag=1;void create()int i,j,p1,p2
5、;double small1,small2,w;coutncinn;/定義一個足夠大的數(shù),方便之后的操作定義哈夫曼樹結(jié)構(gòu)體類型結(jié)點(diǎn)的權(quán)值/結(jié)點(diǎn)的左、右孩子指針和父指針/定義全局變量,方便操作n表示預(yù)處理的結(jié)點(diǎn)數(shù),m表示處理的結(jié)點(diǎn)總數(shù)/健立哈夫曼樹的函數(shù)/i,j用于循環(huán)語句,p1、p2用于記錄操作結(jié)果 /操作的中間變量請輸入預(yù)處理的結(jié)點(diǎn)數(shù):;m=2* n-1; if(n=0) printf(n*n);printf(這是一棵空樹n);printf( *n); return;printf(n*n);printf(”請依次輸入個結(jié)點(diǎn)的權(quán)值(各權(quán)值以空格隔開)n);prin tf(*n)for(i=1;
6、i w; treei.weight=w; treei. num=i; treei.pare nt=O; treei.lchild=O; treei.rchild=O;for(i=n+1;i=m;i+)p仁0;p2=0;small1=MAXV AL;small2=MAXV AL;for(j=1;j=i-1;j+) if(treej.pare nt=0)if(treej.weightsmall1)small2=small1;small仁treej.weight; p2=p1;p1=j;else if(treej.weightsmall2) small2=treej.weight; p2=j;tre
7、ep1.pare nt=i;treep2.pare nt=i;treei. num=i;treei.pare nt=O;treei.lchild=p1;treei.rchild=p2;treei.weight=treep1.weight+treep2.weight; prin tf(n* n);printf(”哈弗曼樹初始化完畢n);printf(* n);void prin t1(htree t)用于輸出哈夫曼樹的先序序列coutttt .num tt.weighte ndl; if(t.lchild!=O)prin t1(treet.lchild);if(t.rchild!=0)prin
8、t1(treet.rchild);void prin t2(htree t)用于輸出哈夫曼樹的中序序列if(t.lchild!=0)prin t2(treet.lchild);coutttt .num tt.weighte ndl; if(t.rchild!=0)prin t2(treet.rchild);void prin t3(htree t)用于輸出哈夫曼樹的中序序列if(t.lchild!=0)prin t3(treet.lchild);if(t.rchild!=0)prin t3(treet.rchild);coutttt .num tt.weightb)return a;retur
9、n b;int mai n()stri ng i,j; while(1) printf(n*printf(”歡迎使用菜單驅(qū)動程序n);printf( * if(flag=1)printf(1初始化哈弗曼樹n);/第一級菜單prin tf(n請選擇您要的操作:);cin i;if(i=1)create。;flag=0;elseprintf(n*printf(”操作錯誤n);printf(* n);con ti nue;printf(”1重新初始化哈弗曼樹n);/第二級菜單printf(”2輸出哈弗曼樹的高度n);printf(”3輸出哈弗曼樹的葉子結(jié)點(diǎn)的個數(shù)n);printf(”4輸出哈弗曼樹n
10、);printf(”5清屏 n);printf(”0結(jié)束操作n);prin tf(n請選擇您要的操作:;);cin i;if(i=1)create(); else if(i=2) if(n=0)prin tf(這是一棵空樹,高度為0n);printf(n*printf(*n); elseprintf(n*printf(”該樹的高度為 dn ,high(treem);printf( *else if(i=3)if(n=0)printf(n*printf(”這是棵空樹,葉子結(jié)點(diǎn)的個數(shù)為0n);printf( *elseprintf(n* printf(該樹的葉子結(jié)點(diǎn)的個數(shù)為%dn,n);print
11、f( *else if(i=4)if(n=0) printf(n* printf(這是一棵空樹n);printf( * con ti nue; while(1)printf(”歡迎使用菜單驅(qū)動程序n);printf(n*prin tf(*n)printf(”1輸出哈弗曼樹的先序序列n); II第三級菜單printf(”2輸出哈弗曼樹的中序序列n ”);printf(”3輸出哈弗曼樹的后序序列n ”);printf(”4返回上層n);printf(”5清屏 n);printf(”0結(jié)束操作n);prin tf(n請輸入您要的操作:”);fflush(stdi n); cinj; if(j=1)p
12、rintf(n*n);printf(”哈弗曼樹的先序序列如下(左為結(jié)點(diǎn)序號,右為為結(jié)點(diǎn)權(quán)值prin tf(*n);prin t1(treem);else if(j=2)printf(n*n);prin tf(哈弗曼樹的中序序列如下(左為結(jié)點(diǎn)序號,右為為結(jié)點(diǎn)權(quán)值prin tf(*n);prin t2(treem);else if(j=3)printf(n*n);printf(”哈弗曼樹的后序序列如下(左為結(jié)點(diǎn)序號,右為為結(jié)點(diǎn)權(quán)值)n);)n);)n);printf(“*n);prin t3(treem);else if(j=4)break;else if(j=5)system(cls); els
13、e if(j=0) prin tf(n*printf(”謝謝使用,再見n);printf(*n);return 1;elseprintf(n* printf(操作錯誤 n);printf( * else if(i=5)system(cls);else if(i=O)prin tf(n* n);printf(”printf(謝謝使用,再見n);* n);return 1; elseprintf(n*printf(操作錯誤n);printf( *運(yùn)行結(jié)果*歡迎使用菜單驅(qū)動程序*1初始化哈夫曼樹請選擇您要的操作:op*操作錯誤*歡迎使用菜單驅(qū)動程序*1初始化哈夫曼樹請選擇您要的操作:1請輸入預(yù)處理的
14、結(jié)點(diǎn)數(shù):0*這是一棵空樹*歡迎使用菜單驅(qū)動程序1. 重新初始化哈夫曼樹2輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5. 清屏0.結(jié)束操作請選擇您要的操作:2*這是一棵空樹,高度為 0*歡迎使用菜單驅(qū)動程序*1. 重新初始化哈夫曼樹2. 輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5. 清屏0.結(jié)束操作請選擇您要的操作:3*這是一棵空樹,葉子結(jié)點(diǎn)的個數(shù)為0*歡迎使用菜單驅(qū)動程序*1. 重新初始化哈夫曼樹2. 輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5. 清屏0.結(jié)束操作請選擇您要的操作:4*這是一棵空樹*歡迎使用
15、菜單驅(qū)動程序*1. 重新初始化哈夫曼樹2輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5. 清屏0.結(jié)束操作請選擇您要的操作:6*操作錯誤*歡迎使用菜單驅(qū)動程序*1. 重新初始化哈夫曼樹2. 輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5. 清屏0.結(jié)束操作請選擇您要的操作:1請輸入預(yù)處理的結(jié)點(diǎn)數(shù):5*請依次輸入個結(jié)點(diǎn)的權(quán)值(各權(quán)值以空格隔開)*1 2 3 4 5*哈夫曼樹初始化完畢*歡迎使用菜單驅(qū)動程序*1. 重新初始化哈夫曼樹2輸出哈夫曼樹的高度3輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5清屏0.結(jié)束操作請選擇您要的操作:2*該樹的高
16、度為 4*歡迎使用菜單驅(qū)動程序*1. 重新初始化哈夫曼樹2. 輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5. 清屏0.結(jié)束操作請選擇您要的操作:3*該樹的葉子結(jié)點(diǎn)的個數(shù)為5*歡迎使用菜單驅(qū)動程序*1. 重新初始化哈夫曼樹2. 輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫曼樹5. 清屏0.結(jié)束操作請選擇您要的操作:4*歡迎使用菜單驅(qū)動程序*1.輸出哈夫曼樹的先序序列2輸出哈夫曼樹的中序序列3輸出哈夫曼樹的后序序列4返回上層5清屏0結(jié)束操作請輸入您要的操作:1*哈夫曼樹的先序序列如下(左為結(jié)點(diǎn)序號,右為為結(jié)點(diǎn)權(quán)值)*9157 63 36 31 12
17、 28 94 45 5*歡迎使用菜單驅(qū)動程序*1輸出哈夫曼樹的先序序列2輸出哈夫曼樹的中序序列3輸出哈夫曼樹的后序序列4返回上層5清屏0結(jié)束操作請輸入您要的操作:2*哈夫曼樹的中序序列如下(左為結(jié)點(diǎn)序號,右為為結(jié)點(diǎn)權(quán)值)*3 37 6116 32 29 154 48 9*歡迎使用菜單驅(qū)動程序*1輸出哈夫曼樹的先序序列2輸出哈夫曼樹的中序序列3輸出哈夫曼樹的后序序列4返回上層5清屏0結(jié)束操作請輸入您要的操作:3*哈夫曼樹的后序序列如下(左為結(jié)點(diǎn)序號,右為為結(jié)點(diǎn)權(quán)值)*3 311226 37 64 45 58 99 15*歡迎使用菜單驅(qū)動程序*1輸出哈夫曼樹的先序序列2輸出哈夫曼樹的中序序列3輸出哈夫曼樹的后序序列4返回上層5清屏0結(jié)束操作請輸入您要的操作:6*操作錯誤*歡迎使用菜單驅(qū)動程序*1輸出哈夫曼樹的先序序列2輸出哈夫曼樹的中序序列3輸出哈夫曼樹的后序序列4返回上層5清屏0結(jié)束操作請輸入您要的操作:4*歡迎使用菜單驅(qū)動程序*1.重新初始化哈夫曼樹2輸出哈夫曼樹的高度3. 輸出哈夫曼樹的葉子結(jié)點(diǎn)的個數(shù)4. 輸出哈夫
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022-2023學(xué)年湖南張家界慈利縣五年級下冊語文期中試卷及答案
- 2024年版女方離婚權(quán)益保障合同范本版B版
- 煉鐵課程設(shè)計(jì)范例
- 2022-2023學(xué)年江蘇省揚(yáng)州市儀征市二年級上學(xué)期數(shù)學(xué)期末試題及答案
- 人教版高中地理必修第一冊第三章地球上的水綜合檢測卷含答案
- 2024年蘇教新版七年級物理下冊月考試卷含答案632
- 2025年小升初數(shù)學(xué)復(fù)習(xí)之小題狂練300題(填空題):比和比例(10題)
- 2020-2021學(xué)年吉林省長春市榆樹市小學(xué)三年級上冊語文期末試題及答案
- 2023年浙江省溫州市瑞安市六年級下冊期末語文試卷及答案
- 2020-2021學(xué)年河南省商丘市睢縣二年級下冊期中考試語文真題及答案
- 棋牌游戲自審自查報告
- 電磁彈射技術(shù)
- 讀后續(xù)寫微技能Toshownottotell課件高三英語一輪復(fù)習(xí)寫作專項(xiàng)
- 電氣設(shè)備維護(hù)保養(yǎng)記錄表
- 陜西華縣皮影戲調(diào)研報告
- 碘量法測定抗壞血酸樣品中維生素c的微型化研究
- 普通高中學(xué)生學(xué)籍表
- 電梯使用單位電梯安全日管控、周排查、月調(diào)度制度和電梯安全總監(jiān)職責(zé)及電梯安全員守則
- 法蘭球閥壓力試驗(yàn)作業(yè)指導(dǎo)書
- 幼兒園優(yōu)質(zhì)課件-中班社會《電話禮儀》
- (完整)雙溪課程評量表
評論
0/150
提交評論