版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章樹(shù)和二叉樹(shù)本講主要內(nèi)容:
樹(shù)和森林哈夫曼樹(shù)及其應(yīng)用6.4樹(shù)和森林6.4.1樹(shù)的存儲(chǔ)結(jié)構(gòu):雙親表示法:除根結(jié)點(diǎn)外的每個(gè)結(jié)點(diǎn)都只有唯一的雙親RABCDEFGHKRDCFHGKABE-1000311666數(shù)組下標(biāo)0123456789樹(shù)的雙親表存儲(chǔ)表示#defineMAX_TREE_SIZE100;Typedef
struct
PTNode{
TElemTypedata;
intpatent;}//PTNode;Typedef
struct{
PTNodenodes[MAX_TREE_SIZE];
intr,n;}//PTree;優(yōu)點(diǎn):parent(T,x),Root(x)操作容易實(shí)現(xiàn)確定:求結(jié)點(diǎn)的孩子時(shí)需要遍歷整個(gè)結(jié)構(gòu)孩子表示法:datachild1child2child3childd······datadegreechild1child2childd······D為樹(shù)的度,結(jié)點(diǎn)同構(gòu),空間浪費(fèi)結(jié)點(diǎn)不同構(gòu),空間不浪費(fèi),操作不方便RDCFHGKABE012345678935^6^^^^^^^012^789^適用于涉及孩子的操作樹(shù)的孩子鏈表存儲(chǔ)表示Typedef
struct
CTNode{//孩子結(jié)點(diǎn)
intchild;
struct
CTNode*next; }*childptr;Typedef
struct{
TElemTypedata;
childptr
firstchild;//孩子鏈表頭指針 }CTBox;Typedef
struct{
CTBoxnodes[MAX_TREE_SIZE];
intn,r; //結(jié)點(diǎn)數(shù)和根的位置; }//CTree;RDCFHGKABE4440-10266635^6^^^^^^^012^789^0123456789帶雙親的孩子鏈表孩子表示法和雙親表示法結(jié)合起來(lái),即帶雙親的孩子鏈表孩子兄弟表示法:以二叉鏈表表示每個(gè)結(jié)點(diǎn)有兩個(gè)鏈域:firstchild和nextsibling:第一個(gè)孩子結(jié)點(diǎn)和下一個(gè)兄弟結(jié)點(diǎn)Typedef
struct
CSNode{ElemTypedata;Struct
CSNode*firstchild,*nextsibling;}CSNode,*CSTree;R^ADBECFGHK^^^^^^^^RABCDEFGHK6.4.2森林與二叉樹(shù)的轉(zhuǎn)換ABCEDABCED^ABCDE^^^^^任何一棵與樹(shù)對(duì)應(yīng)的二叉樹(shù),其右子樹(shù)都為空孩子兄弟表示法對(duì)應(yīng)的二叉樹(shù)樹(shù)轉(zhuǎn)換為二叉樹(shù)森林與二叉樹(shù)的對(duì)應(yīng)關(guān)系A(chǔ)BCDEFGIHJEFABCDGIHJABCDEFGIHJ樹(shù)與二叉樹(shù)對(duì)應(yīng)森林與二叉樹(shù)森林/樹(shù)與二叉樹(shù)之間的相互轉(zhuǎn)換森林轉(zhuǎn)換成二叉樹(shù):若F={T1,T2,···Tm}是森林,則按如下規(guī)則轉(zhuǎn)換成一棵二叉樹(shù)B=(root,LB,RB):(1)若F為空,則m=0,B為空;(2)若F非空,則B的根root是森林中的第一顆樹(shù)的根ROOT(T1);B的左子樹(shù)LB是從T1中根結(jié)點(diǎn)的子樹(shù)森林F1={T11,T12,···,T1m1}轉(zhuǎn)換而成的二叉樹(shù);B的右子樹(shù)RB是從森林F’={T2,T3,···,Tm}轉(zhuǎn)換而成的二叉樹(shù)二叉樹(shù)轉(zhuǎn)換成森林:6.4.3樹(shù)和森林的遍歷樹(shù)的遍歷:先根遍歷后根遍歷森林的遍歷:先序遍歷森林中序遍歷森林:(1)中序遍歷森林中的第一顆樹(shù)的根結(jié)點(diǎn)的子樹(shù)森林;(2)訪問(wèn)第一顆樹(shù)的根結(jié)點(diǎn);(3)中序遍歷剩余的樹(shù)構(gòu)成的森林。ABCDEFGIHJ1、樹(shù)的先根次序訪問(wèn)為二叉樹(shù)的先序遍歷。樹(shù)的后根次序訪問(wèn)為二叉樹(shù)的中序遍歷。
2、森林的先根次序訪問(wèn)序列對(duì)應(yīng)為二叉樹(shù)的先序遍歷序列。森林的中根次序訪問(wèn)序列對(duì)應(yīng)為二叉樹(shù)的中序遍歷序列。
兩個(gè)結(jié)論:畫(huà)出和下列已知序列對(duì)應(yīng)的樹(shù)T:樹(shù)的先根次序訪問(wèn)序列為:GFKDAIEBCHJ樹(shù)的后根次序訪問(wèn)序列為:DIAEKFCJHBG畫(huà)出和下列已知序列對(duì)應(yīng)的森林F:森林的先根次序訪問(wèn)序列為:ABCDEFGHIJKL森林的中根次序訪問(wèn)序列為:CBEFDGAJIKLH原則:森林的先序/中序遍歷,即對(duì)應(yīng)二叉樹(shù)的先序/中序遍歷先做二叉樹(shù):畫(huà)出和下列已知序列對(duì)應(yīng)的森林F:
森林的先序次序訪問(wèn)序列為:ABCDEFGHIJKL
森林的中序次序訪問(wèn)序列為:CBEFDGAJIKLHACBEFDGJIKLHAJIKLBEFDGCHBHCDIAEFGJKLBHCDIAGJEFKL二叉樹(shù)先ABCDEFGHIJKL中CBEFDGAJIKLH森林BHCDIGJEFKLABHCDIAGJEFKL6.6哈夫曼樹(shù)及其應(yīng)用哈夫曼樹(shù):最優(yōu)樹(shù),帶權(quán)路徑長(zhǎng)度最短的樹(shù)。6.6.1最優(yōu)二叉樹(shù)(哈夫曼樹(shù))路徑:從樹(shù)中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的分支構(gòu)成兩個(gè)結(jié)點(diǎn)之間的路徑;路徑長(zhǎng)度:路徑上的分支數(shù)目;樹(shù)的路徑長(zhǎng)度:從樹(shù)根到每一個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和樹(shù)的帶權(quán)路徑長(zhǎng)度:樹(shù)中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和
其中:wk為k個(gè)結(jié)點(diǎn)的權(quán)值最優(yōu)二叉樹(shù)(哈夫曼樹(shù)):帶權(quán)路徑長(zhǎng)度WPL最小的二叉樹(shù)如何構(gòu)造哈夫曼樹(shù)abcd7524abcd7524abcd7524不同帶權(quán)路徑長(zhǎng)度的二叉樹(shù)先看下面的幾棵二叉樹(shù),考慮他們的區(qū)別WPL=(7+5+2+4)*2=36WPL=46WPL=35再看一個(gè)實(shí)際的問(wèn)題:將百分制轉(zhuǎn)換成五分制的程序if(a<60)b=“bad”;elseif(a<70)b=“pass”;elseif(a<80)b=“general”; elseif(a<90)b=“good”; elseb=“excellent”;a<60不及格a<70及格a<80中等a<90良好優(yōu)良問(wèn):在成績(jī)分布如下的情況下,程序的操作時(shí)間會(huì)怎樣?分?jǐn)?shù)0~5960~6970~7980~8990~100比例數(shù)0.050.150.400.300.10a<80a<60中等40良好30不及格5優(yōu)秀10及格15a<90a<70YNYYNNNY70≤a<8080≤a<9060≤a<70a<60中等40良好30不及格5優(yōu)秀10及格15YYYYNNNN分別以5,15,40,30,10的權(quán)構(gòu)造一棵有5個(gè)結(jié)點(diǎn)的哈夫曼樹(shù)將兩次比較分開(kāi)WPL=205WPL=220然后,看構(gòu)造哈夫曼樹(shù)的過(guò)程abcd7524cd24ab756cd24b511a7abcd752418最后我們可以總結(jié)一個(gè)哈夫曼算法:(1)根據(jù)給定的n個(gè)權(quán)值{w1,w2,···,wn}構(gòu)成n棵二叉樹(shù)的集合F={T1,T2,···,Tn},其中每棵二叉樹(shù)Ti中只有一個(gè)帶權(quán)為wi的根結(jié)點(diǎn),其左右子樹(shù)均空。(2)在F中選取兩棵根結(jié)點(diǎn)的權(quán)值最小的樹(shù)作為左右子樹(shù)構(gòu)造一棵新的二叉樹(shù),且置新的二叉樹(shù)的根結(jié)點(diǎn)的權(quán)值為其左、右子樹(shù)上根結(jié)點(diǎn)的權(quán)值之和。(3)在F中刪除這兩棵樹(shù),同時(shí)將新得到的二叉樹(shù)加入F中。(4)重復(fù)(2)(3),直到F只含一棵樹(shù)為止。這顆樹(shù)就是哈夫曼樹(shù)。abcd7524cd24ab756編碼問(wèn)題:等長(zhǎng)的二進(jìn)制編碼:如:字符A/B/C/D編碼:00011011則:在翻譯電文時(shí)2位一組即可不等長(zhǎng)的二進(jìn)制編碼:如:字符A/B/C/D編碼:000101則:如果收到電文:0000,得到譯文就不是唯一的結(jié)論:若要設(shè)計(jì)長(zhǎng)度不等的編碼,則必須是任一字符的編碼都不是另一個(gè)編碼的前綴——前綴編碼6.6.2哈夫曼編碼ABCD111000編碼A(0)B(10)C(110)D(111)問(wèn):編碼{00,01,10,11},{0,1,00,11},{0,10,110,111},哪一組不是前綴碼?前綴編碼示例哈夫曼樹(shù)的特點(diǎn):沒(méi)有度為1的結(jié)點(diǎn),稱為嚴(yán)格的二叉樹(shù)哈夫曼樹(shù)與哈夫曼編碼的存儲(chǔ)表示Typedef
struct{ unsignedintweight; unsignedintparent,lchild,rchild;}HTNode,*HuffmanTree;//動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼樹(shù)Typedefchar*HuffmanCode;//動(dòng)態(tài)分配哈夫曼編碼表ABCD1110007700560025004500663411725170161234567例如:70005000200040000000000000001234567abcd7524cd24ab756cd24b511a7abcd752418700050002500450060340000000012345677000560025004500663411025000012345677700560025004500663411725180161234567哈夫曼樹(shù)的構(gòu)造過(guò)程構(gòu)造哈夫曼樹(shù),求哈夫曼編碼的算法voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn){//w存放n個(gè)字符的權(quán)值,構(gòu)造哈夫曼樹(shù)HT,求n個(gè)字符的哈夫曼編碼表if(n<=1)return;m=2*n-1;//n個(gè)字符的哈夫曼樹(shù)有(2*n-1)個(gè)結(jié)點(diǎn)HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));for(p=HT,i=1;i<=n;++i,++p,++w)*p={*w,0,0,0};for(;i<=m;++i,++p)*p={0,0,0,0};for(i=n+1;i<=m;++i){//構(gòu)造哈夫曼樹(shù) select(HT,i-1,s1,s2);//選擇parent為0且權(quán)值最小的兩個(gè)結(jié)點(diǎn):s1,s2 HT[s1].parnet=i;HT[s2].parent=i; HT[i].child=s1;HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s1].weight; }*****//從葉子到根逆向求每個(gè)字符的哈夫曼編碼HC=(HuffmanCode)malloc((n+1)*sizeof(char*));cd=(char*)malloc(n*sizeof(char));cd[n-1]=“\0”;for(i=1;i<=n;++i){ start=n-1; for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c)cd[--start]=“0”; elsecd[--start]=“1”;
Hc[i]=(chat*)malloc((n-start)*sizeof(char));
atrcpy(HC[i],&cd[start]);}free(cd);}//HuffmanCoding7700560025004500663411725170161234567*****從根結(jié)點(diǎn)遍歷哈夫曼樹(shù),求哈夫曼編碼7700560025004500663411725170161234567ABCD111000*****算法:HC=(HuffmanCode)malloc((n+1)*sizeof(char*));P=m;cdlen=0;For(i=1;i<=m;++i)HT[i].weight=0;While(p){ if(HT[p].weight==0){ HT[p].weight=1; if(HT[p].lchild!=0){p=HT[p].lchild;cd[cdlen++]=“0”;} elseif(HT[p].rchild==0){ HC[p]=(char*)malloc((cdlen+1)*sizeof(char));
cd[cdlen]=“\0”;atrcpy(HC[p],cd);} }elseif(HT[p].weight==1{
HT[p].weight=2; if(HT[p].rchild!=0){p=HT[p].rchild;cd[cdlen++]=“1”;} }else{HT[p].weight=0;p=HT[p].parent;--cdlen;}}//while*****例1:電文的譯碼:分解電文中字符串,從根結(jié)點(diǎn)出發(fā),按字符0/1確定左、右孩子,直到葉子結(jié)點(diǎn)。分析:假設(shè)電文為:101110110111A700B600C500D500663411725170161234567j=1;i=1While(j<=code.len){P=m;while(p->lchild)||(p->rchild){ ifcode[j]=0p=p->lchild
elsep=p->rchild; j=j+1}
ABCD111000例2:已知某系統(tǒng)在通信聯(lián)絡(luò)中只可能出現(xiàn)8種字符,其概率分布為0.05,0.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 晚年養(yǎng)老服務(wù)合同
- 鋼筋工程制安分包合同
- 標(biāo)準(zhǔn)合同范本勞務(wù)分包合同的適用范圍
- 派遣合同與正式工合同對(duì)比
- 場(chǎng)地技術(shù)服務(wù)協(xié)議
- 月嫂服務(wù)協(xié)議范例樣本
- 房屋買賣合同再審二審答辯狀
- 果樹(shù)苗木采購(gòu)合同協(xié)議
- 傳統(tǒng)交易采購(gòu)合同的合規(guī)性
- 無(wú)房產(chǎn)證房產(chǎn)交易合同
- 植物的抗熱性
- 《人際關(guān)系與溝通技巧》(第3版)-教學(xué)大綱
- 2023年中醫(yī)養(yǎng)生之藥膳食療考試試題
- 某土石方施工工程主要施工機(jī)械設(shè)備表
- 硅PU(塑料面層)檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
- 高空除銹刷漆施工方案模板
- 信訪面試資料
- 【課件】《“敬畏生命珍愛(ài)生命”》主題班會(huì)課件
- 住宅物業(yè)危險(xiǎn)源辨識(shí)評(píng)價(jià)表
- 《報(bào)告文學(xué)研究》(07562)自考考試復(fù)習(xí)題庫(kù)(含答案)
- ASME-B31.3-2008-工藝管道壁厚計(jì)算
評(píng)論
0/150
提交評(píng)論