版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
#ifndefTREE_H_INCLUDED#defineTREE_H_INCLUDED#include<string>#include<stack>usingnamespacestd;typedefcharElemType;typedefintElemHfm;typedefstructTreeNode{ElemTypedata; intltag,rtag;//線索標(biāo)志structTreeNode*lchild;structTreeNode*rchild;}BTree,*PBTree;typedefstruct{ ElemHfmdata; floatweight; intparent; intlchild; intrchild;}HTNode;//哈夫曼樹的構(gòu)造classTree{ PBTreepre;//指向當(dāng)前子樹的前驅(qū)節(jié)點(diǎn) PBTreecreate_fam(charpre[],charin[],intn); PBTreecreate_map(charpost[],charin[],intn); voidvisitTreeNode_f(PBTreet); voidvisitTreeNode_m(PBTreet); voidvisitTreeNode_p(PBTreet); voidThread(PBTreet);//對(duì)一棵樹進(jìn)展線索化public:Tree(){};PBTreeCreateBTree(chars[],chart[],intselect);//select=0,1,2時(shí)分別是先中后序 voidvisitTreeNode(PBTreet,intselect); PBTreeCreateThread(PBTreet);//中序線索化二叉樹 voidvisitInOrder(PBTreet);//中序遍歷線索二叉樹};classHFMTree{public: voidCreateHT(HTNodeht[],intn);};#endif//TREE_H_INCLUDED#include"Tree.h"#include<iostream>PBTreeTree::create_fam(charpre[],charin[],intn){intp,k;PBTrees;p=k=0; if(n==0)returnNULL;for(p=0;p<n;++p){if(pre[0]==in[p]){ k=p;break;}}s=newBTree();s->data=pre[0];s->lchild=create_fam(pre+1,in,k);s->rchild=create_fam(pre+k+1,&in[p]+1,n-k-1);returns;}PBTreeTree::create_map(charpost[],charin[],intn){ intp,maxpos; PBTrees=NULL; maxpos=n-1; if(n<=0)returnNULL; for(p=0;p<n;++p) { if(in[p]==post[maxpos]) { break; } } s=newBTree(); s->data=post[maxpos]; s->lchild=create_map(post,in,p); s->rchild=create_map(post+p,&in[p]+1,n-p-1); returns;}PBTreeTree::CreateBTree(chars[],chart[],intselect){ switch(select) { case0: returncreate_fam(s,t,strlen(s)); case1: returncreate_map(s,t,strlen(s)); default:returnNULL; }}voidTree::visitTreeNode_f(PBTreet){ stack<PBTree>St; PBTreep; if(t) {//先序遍歷的時(shí)候先讓右孩子進(jìn)棧,在進(jìn)左孩子,那么出棧的時(shí)候會(huì)先出左孩子,符合遍歷樹的要求。 St.push(t); while(!St.empty()) { p=St.top(); St.pop();//出棧 cout<<p->data<<""; if(p->rchild)//假設(shè)有右孩子 { St.push(p->rchild); } if(p->lchild)//假設(shè)有左孩子 { St.push(p->lchild); } }; }}voidTree::visitTreeNode_m(PBTreet){ stack<PBTree>St; PBTreep; if(t) { p=t; while(!St.empty()||p) { while(p)//一直向左 { St.push(p); p=p->lchild; } if(!St.empty())// { p=St.top(); St.pop();// cout<<p->data<<"";//輸出 p=p->rchild;//key } } }}voidTree::visitTreeNode_p(PBTreet){ stack<PBTree>St; PBTreep,q; intflag; if(t) { p=t; do { while(p) { St.push(p); p=p->lchild; } q=NULL; flag=1; while(!St.empty()&&flag)//每次向右轉(zhuǎn)后在向最左轉(zhuǎn) { p=St.top(); if(p->rchild==q)//右孩子不存在或右孩子已經(jīng)被訪問。 { cout<<p->data<<""; q=p;//假設(shè)p的右子樹被訪問過,那么q指向p St.pop(); } else { p=p->rchild; flag=0; } } }while(!St.empty()); }}voidTree::visitTreeNode(PBTreet,intselect){ switch(select) { case0: visitTreeNode_f(t); break; case1: visitTreeNode_m(t); break; case2: visitTreeNode_p(t); default:break; }}voidTree::Thread(PBTreet)//中序遍歷{ if(t) { Thread(t->lchild); if(t->lchild==NULL) { t->lchild=pre;//假設(shè)左子樹空了,那么使其指向前驅(qū) t->ltag=1; } elset->ltag=0; if(pre->rchild==NULL)//因?yàn)檫@里需要前驅(qū)節(jié)點(diǎn)指向,所以增加了一個(gè)虛擬節(jié)點(diǎn) { pre->rchild=t; pre->rtag=1; } elsepre->rtag=0; pre=t; Thread(t->rchild); }}PBTreeTree::CreateThread(PBTreet){ PBTreeroot;//一個(gè)根節(jié)點(diǎn) root=newBTree();//創(chuàng)立頭節(jié)點(diǎn) root->ltag=0,root->rtag=1;//初始化頭節(jié)點(diǎn) root->rchild=t;//讓root的右子樹指向跟結(jié)點(diǎn) if(!t) { root->rchild=root;//假設(shè)所指子樹為空那么回指 } else { root->lchild=t; pre=root;//在調(diào)用Thread之前一定要初始化pre Thread(t); pre->rchild=root; pre->rtag=1; root->rchild=pre; } returnroot;}voidTree::visitInOrder(PBTreet)//這里傳入的是根節(jié)點(diǎn),不是樹的第一個(gè)節(jié)點(diǎn){ PBTreep=t->lchild;//p指向樹的第一個(gè)節(jié)點(diǎn) if(p) { while(p!=t) { while(p->ltag==0)p=p->lchild;//找到第一個(gè)節(jié)點(diǎn) cout<<p->data<<""; while(p->rtag==1&&p->rchild!=t)//假設(shè)有子樹為空那么可以一直找到其中序遍歷的后繼 { p=p->rchild; cout<<p->data<<""; } p=p->rchild; } }}voidHFMTree::CreateHT(HTNodeht[],intn){ inti,j,k,lnode,rnode; intmin1,min2; for(i=0;i<2*n-1;++i)ht[i].parent=-1;//初始化所有節(jié)點(diǎn)的父節(jié)點(diǎn)都為-1 for(i=n;i<2*n-1;++i) { min1=min2=32767; lnode=rnode=-1; for(j=0;j<i-1;++j) if(ht[j].parent==-1) { if(min1>ht[j].weight) { min2=min1;rnode=lnode; min1=ht[j].weight;rnode=j; } elseif(min2>ht[j].weight) { min2=ht[j].weight; rnode=j; } } ht[lnode].parent=i;ht[rnode].parent=i; ht[i].weight=min1+min2; ht[i].lchild=lnode; ht[i].rchild=rnode; }}#include<iostream>#include"Tree.h"voidtest1(PBTrees){if(s){cout<<s->data<<"";test1(s->lchild);test1(s->rchild);}}voidtest2(PBTrees){if(s){test2(s->lchild); cout<<s->data<<"";test2(s->rchild);
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年長垣烹飪職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬測(cè)試卷附答案解析
- 2025年長沙縣招教考試備考題庫帶答案解析(必刷)
- 2025年龍南縣招教考試備考題庫附答案解析(奪冠)
- 2026年上海健康醫(yī)學(xué)院單招職業(yè)傾向性測(cè)試題庫附答案解析
- 2026年云南商務(wù)職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫帶答案解析
- 2026年保定電力職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測(cè)試題庫帶答案解析
- 2026年內(nèi)蒙古北方職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性考試題庫附答案解析
- 殘疾人安全培訓(xùn)管理制度
- 調(diào)解人員培訓(xùn)制度
- 殘疾人駕駛培訓(xùn)保障制度
- 司機(jī)入職心理測(cè)試題及答案
- 退休支部換屆工作報(bào)告
- T/CMES 37002-2022景區(qū)玻璃類游樂和觀景設(shè)施建造單位能力條件要求
- T/CATCM 029-2024中藥材產(chǎn)地加工(趁鮮切制)生產(chǎn)技術(shù)規(guī)范
- 2025至2030中國氯蟲苯甲酰胺行業(yè)應(yīng)用狀況及未來前景展望報(bào)告
- 網(wǎng)絡(luò)游戲代練團(tuán)隊(duì)服務(wù)合作協(xié)議
- 活牛轉(zhuǎn)讓協(xié)議書
- 高血壓病人的手術(shù)中護(hù)理
- 乙肝患者透析管理規(guī)范
- 老人臨終前的正確護(hù)理
- 防性侵家長會(huì)課件教學(xué)
評(píng)論
0/150
提交評(píng)論