




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、AU點(diǎn)曙/身(2012/2013學(xué)年第二學(xué)期)題目:二叉樹的基本操作及哈夫曼編專業(yè)服務(wù)外包學(xué)生姓名王翰林班級(jí)學(xué)號(hào)B11041209指導(dǎo)教師鄒志強(qiáng)指導(dǎo)單位計(jì)算機(jī)軟件學(xué)院日期2012.10.26簡短評(píng)語教師簽名:年月日評(píng)分等級(jí)備注評(píng)分等級(jí)有五種:優(yōu)秀、良好、中等、及格、不及格一.實(shí)驗(yàn)?zāi)康暮鸵竽康模?、掌握二叉鏈表上實(shí)現(xiàn)二叉樹基本操作。2、學(xué)會(huì)設(shè)計(jì)基于遍歷的求解二叉樹應(yīng)用問題的遞歸算法。3、理解哈夫曼樹的構(gòu)造算法,學(xué)習(xí)設(shè)計(jì)哈夫曼編碼和譯碼系統(tǒng)要求:能成功演示二叉樹的有關(guān)算法,運(yùn)算完畢后能成功釋放二叉樹所有結(jié)點(diǎn)占用的系統(tǒng)類存。二.實(shí)驗(yàn)環(huán)境(實(shí)驗(yàn)設(shè)備)學(xué)校機(jī)房電腦設(shè)備硬件,VC+6.0軟件三.實(shí)驗(yàn)原理
2、及內(nèi)容原理:(1)在二叉樹上實(shí)現(xiàn)二叉樹運(yùn)算1:設(shè)計(jì)遞歸算法,實(shí)現(xiàn)下列二叉樹運(yùn)算:刪除一棵二叉樹,求一棵二叉樹的高度,求一棵二叉樹中葉子結(jié)點(diǎn)數(shù),復(fù)制一棵二叉樹,交換一棵二叉樹的左右子樹。2:設(shè)計(jì)算法,按自上到下,自左向右的次序,即按層次遍歷一棵二叉樹。3:設(shè)計(jì)main函數(shù),測試上述每個(gè)運(yùn)算。(2)哈夫曼編碼和譯碼系統(tǒng)1:所設(shè)計(jì)的系統(tǒng)重復(fù)顯示以下菜單項(xiàng)。B一建樹:讀入字符集和各字符頻度,建立哈夫曼樹。T一遍歷:先序和中序遍歷二叉樹。E一生成編碼:根據(jù)已建成的哈夫曼樹,產(chǎn)生個(gè)字符的哈夫曼編碼。C一編碼:輸入由字符集中字符組成的任意字符串,利用已生成的哈夫曼樹進(jìn)行編碼,顯示編碼結(jié)果,并將輸入的字符串及
3、其編碼結(jié)果保存在磁盤文件中。D譯碼:讀入文件,利用已建成的哈夫曼樹進(jìn)行譯碼,并將譯碼結(jié)果存入磁盤文件P一打?。浩聊伙@示文件。X一退出。內(nèi)容:1、建立頭文件BTree.H,在該文件中定義二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),并編寫二叉樹的各種基本操作實(shí)現(xiàn)函數(shù)。同時(shí)建立一個(gè)驗(yàn)證操作實(shí)現(xiàn)的主函數(shù)文件Test.cpp,編譯并調(diào)試程序,直到正確運(yùn)行。注意:需要用到隊(duì)列的有關(guān)操作。說明:二叉樹的基本操作可包括:(1)voidClear(BTreeNode*BT)/消除一棵二叉樹,并釋放結(jié)點(diǎn)空間(2) voidMakeTree(BTreeNode*BT)(3) voidBreakTree(BTreeNode*BT)(4)v
4、oidPreOrder(BTreeNode*BT)(5)voidInOrder(BTreeNode*BT)(6)voidPostOrder(BTreeNode*BT)(7)voidFloorOrder(BTreeNode*BT)(8)intSize(BTreeNode*BT)/(9)voidExchange(BTreeNode*BT)(10)intGetHeight(BTreeNode*BT)四.概要設(shè)計(jì)/構(gòu)造一棵二叉樹BT/撤銷一棵二叉樹BT/先序遍歷二叉樹BT/中序遍歷二叉樹BT/后序遍歷二叉樹BT/層次遍歷二叉樹BT求二叉樹BT的結(jié)點(diǎn)數(shù)量/把二叉樹BT的左右子樹進(jìn)行交換/求二叉樹BT的高
5、度1.流程圖及設(shè)計(jì)思想求樹的高度左右子樹高度之和進(jìn)行比較,誰大誰就是樹的高度刪除二叉樹先刪除左子樹,再刪-除右子樹,最后刪除根節(jié)點(diǎn),再釋放結(jié)點(diǎn)空間2,本程序包含的模塊(1)主程序模塊Voidmain()(初始化;構(gòu)造一棵二叉樹;各種遍歷二叉樹;對(duì)二叉樹進(jìn)行各種常見運(yùn)算;刪除二叉樹;)(2)二叉樹模塊一一實(shí)現(xiàn)二叉樹的抽象數(shù)據(jù)類型和基本操作(3)隊(duì)列模塊一一實(shí)現(xiàn)隊(duì)列的抽象數(shù)據(jù)類(4)二叉樹運(yùn)算模塊一一求二叉樹的結(jié)點(diǎn),葉子數(shù)目五.詳細(xì)設(shè)計(jì)一.先序遍歷:A.自然語言描述:1,判斷根節(jié)點(diǎn)會(huì)否為空,如果為空,返回2.如果根節(jié)點(diǎn)不為空3,先輸出根節(jié)點(diǎn),再遞歸調(diào)用自身依次輸出左孩子和右孩子B.代碼詳細(xì)分析te
6、mplate<classT>voidBinaryTree<T>:PreOrder(void(*Visit)(T&x)(PreOrder(Visit,root);)template<classT>voidBinaryTree<T>:PreOrder(void(*Visit)(T&x),BTNode<T>*t)(if(t)(Visit(t->element);PreOrder(Visit,t->lChild);PreOrder(Visit,t->rChild);二.中序遍歷:A.自然語言描述:1 .判斷根
7、節(jié)點(diǎn)是否為空,如果為空,返回2 .如果根節(jié)點(diǎn)不為空3 .遞歸調(diào)用自身輸出左孩子,再輸出根結(jié)點(diǎn),遞歸調(diào)用輸出右孩子B.代碼詳細(xì)分析:template<classT>voidBinaryTree<T>:InOrder(void(*Visit)(T&x)(InOrder(Visit,root);template<classT>voidBinaryTree<T>:InOrder(void(*Visit)(T&x),BTNode<T>*t)(if(t)(InOrder(Visit,t->lChild);Visit(t-&g
8、t;element);InOrder(Visit,t->rChild);三.后序遍歷:A.自然語言描述:1 .判斷根節(jié)點(diǎn)是否為空,如果為空,返回2 .如果根節(jié)點(diǎn)不為空3 .遞歸調(diào)用自身輸出左孩子和右孩子,再輸出根結(jié)點(diǎn)B.代碼詳細(xì)分析:template<classT>voidBinaryTree<T>:PostOrder(void(*Visit)(T&x)(PostOrder(Visit,root);template<classT>voidBinaryTree<T>:PostOrder(void(*Visit)(T&x),BT
9、Node<T>*t)(if(t)(PostOrder(Visit,t->lChild);PostOrder(Visit,t->rChild);Visit(t->element);四.層次遍歷二叉樹:A.自然語言描述:1 .定義頭指針和尾指針和空指針p2 .根節(jié)點(diǎn)是否為空,如果是,結(jié)束3 .如果不是,根節(jié)點(diǎn)入隊(duì)4 .取隊(duì)首元素,輸出隊(duì)首元素5 .將隊(duì)首的非空左右結(jié)點(diǎn)入隊(duì)列,刪除隊(duì)首元素6 .循環(huán)下去,直到隊(duì)列為空B.代碼詳細(xì)分析:template<classT>voidBinaryTree<T>:FloorOrder(void(*Visit)
10、(T&x)(FloorOrder(Visit,root);template<classT>voidBinaryTree<T>:;FloorOrder(void(*Visit)(Visit<T>*x),BTNode<T>*t)(SeqQueue<BTNode<T>*>se(100);se.EnQueue(t);BTNode<T>*temp;while(!se.IsEmpty()(se.Front(temp);Visit(temp);se.DeQueue();if(temp->lchild)se.En
11、Queue(temp->lchild);if(temp->child)se.EnQueue(temp->rchild);五.求二叉樹的結(jié)點(diǎn)數(shù):A.自然語言描述:1:判斷根節(jié)點(diǎn)是否為空,如果為空,返回02:如果根節(jié)點(diǎn)不為空3:遞歸調(diào)用求二叉樹的結(jié)點(diǎn)數(shù)的函數(shù),參數(shù)改為根節(jié)點(diǎn)的左孩子4:遞歸調(diào)用求二叉樹的結(jié)點(diǎn)數(shù)的函數(shù),參數(shù)改為根節(jié)點(diǎn)的右孩子5:返回根節(jié)點(diǎn)的左右字?jǐn)?shù)的結(jié)點(diǎn)數(shù)之和B.代碼詳細(xì)分析:template<classT>intBinaryTree<T>:Size()(returnSize(root);template<classT>intBi
12、naryTree<T>:Size(BTNode<T>*t)(if(!t)return0;elsereturnSize(t->lChild)+Size(t->rChild)+1;)六.二叉樹的左右交換:A.自然語言描述:1 .判斷根節(jié)點(diǎn)是否為空,如果為空,返回2 .如果不為空,再判斷該節(jié)點(diǎn)左右孩子是否同時(shí)為空,3 .如果是,返回4 .如果不為空,交換左右孩子5 .返回循環(huán),遍歷左右子樹B.代碼詳細(xì)分析:template<classT>voidBinaryTree<T>:Exchange()(Exchange(root);)templat
13、e<classT>voidBinaryTree<T>:Exchange(BTNode<T>*t)(if(!t)return;BTNode<T>*temp;temp=t->lChild;t->lChild=t->rChild;t->rChild=temp;Exchange(t->lChild);Exchange(t->rChild);)七.求二叉樹的深度:A.自然語言描述:1:判斷根節(jié)點(diǎn)是否為空,如果根節(jié)點(diǎn)為空,返回02:如果根節(jié)點(diǎn)不為空但是根節(jié)點(diǎn)的左右孩子同時(shí)為空,返回13:如果以上兩個(gè)條件都不成立4:遞歸調(diào)用
14、求二叉樹的深度,函數(shù)的參數(shù)改為根節(jié)點(diǎn)的左孩子,并且深度初始化為15:遞歸調(diào)用求二叉樹的深度,函數(shù)的參數(shù)改為跟結(jié)點(diǎn)的右孩子,并且深度初始化為06:返回4與5步中得出深度較大的那個(gè)數(shù)作為二叉樹的深度數(shù)B.代碼詳細(xì)分析:template<classT>intBinaryTree<T>:GetHeight(BTNode<T>*t)(inttempl;inttempr;if(!t)return0;templ=GetHeight(t->lChild);tempr=GetHeight(t->rChild);if(templ+>tempr+)returnt
15、empl;elsereturntempr;六.實(shí)驗(yàn)總結(jié):在剛進(jìn)行編寫這個(gè)程序的時(shí)候,只是機(jī)械的將課本上的算法敲上去,然后執(zhí)行,可是在后面的幾個(gè)功能中,在需要在前面的基礎(chǔ)上進(jìn)行改變,例如:在求深度的時(shí)候,則和遍歷有點(diǎn)類似,只不過,深度是分別遍歷左子樹和右子樹,然后比較;最難的則是層次遍歷了,最初的時(shí)候一點(diǎn)兒思緒也沒有,后來在同學(xué)的幫助下和上網(wǎng)查了相關(guān)的資料,才編寫出來,真可謂幾經(jīng)波折。實(shí)驗(yàn)任務(wù)要求不僅要求對(duì)課本知識(shí)有較深刻的了解,同時(shí)要求程序設(shè)計(jì)者有較強(qiáng)的思維和動(dòng)手能力,讓更加了解編程思想和編程技巧。這次實(shí)驗(yàn)設(shè)計(jì)讓我有一個(gè)深刻的體會(huì),那就是細(xì)節(jié)決定成敗,編程最需要的是嚴(yán)謹(jǐn),如何的嚴(yán)謹(jǐn)都不過分,往
16、往檢查了半天發(fā)現(xiàn)錯(cuò)誤發(fā)生在某個(gè)括號(hào),分號(hào),引號(hào),或者數(shù)據(jù)類型上。例如:在撤銷一棵二叉樹時(shí)刪除根節(jié)點(diǎn),沒有把根節(jié)點(diǎn)置為空,又或者中請(qǐng)了一個(gè)新的結(jié)點(diǎn)空間,卻沒有把它釋放等等。這次實(shí)驗(yàn)讓我收獲不少,我認(rèn)識(shí)到了,大一的課程確實(shí)沒有學(xué)好,一定程度上影響到了這次程序設(shè)計(jì),不過我的確把二叉樹的一些基本概念掌握得更牢固了,學(xué)到了二叉樹的一些基本運(yùn)算,多多少少給我積累了編程的經(jīng)驗(yàn),更加激發(fā)了我對(duì)數(shù)據(jù)結(jié)構(gòu)的興趣,讓我更有信心把這門課學(xué)好,讓我更有信心把這門專業(yè)學(xué)好。謝謝老師!七.測試結(jié)果:C:UserssaoxueerDesktopDSA-Exp-2-only_BTreeTest.exe前序遍歷BDCEF中序遍歷
17、DBECF后序遍歷DEFCB結(jié)點(diǎn)數(shù)和5當(dāng)右頭震后的前序遢歷BCFED樹的圖度曲八.“二叉樹基本運(yùn)算”源代碼:BTree.h:#include<iostream>usingnamespacestd;template<classT>structBTNode(Telement;BTNode<T>*lChild,*rChild;BTNode()(lChild=rChild=NULL;BTNode(constT&x)(element=x;lChild=rChild=NULL;BTNode(constT&x,BTNode<T>*l,BTNod
18、e<T>*r)(element=x;lChild=l;rChild=r;template<classT>classBinaryTree(public:BinaryTree()root=NULL;BinaryTree()Clear(root);boolIsEmpty()const;voidClear();boolRoot(T&x)const;intSize();voidMakeTree(constT&e,BinaryTree<T>&left,BinaryTree<T>&right);voidBreakTree(T&a
19、mp;e,BinaryTree<T>&left,BinaryTree<T>&right);voidLevelOrder(void(*Visit(T&x);voidPreOrder(void(*Visit)(T&x);voidInOrder(void(*Visit)(T&x);voidPostOrder(void(*Visit)(T&x);voidExchange();intGetHeight();protected:BTNode<T>*root;private:voidClear(BTNode<T>
20、*t);intSize(BTNode<T>*t);voidLevelOrder(void(*Visit)(T&x),BTNode<T>*t);voidPreOrder(void(*Visit)(T&x),BTNode<T>*t);voidInOrder(void(*Visit)(T&x),BTNode<T>*t);voidPostOrder(void(*Visit)(T&x),BTNode<T>*t);voidExchange(BTNode<T>*t);intGetHeight(BTNode
21、<T>*t);template<classT>voidBinaryTree<T>:Clear(BTNode<T>*t)if(!t)return;Clear(t->lChild);Clear(t->rChild);deletet;template<classT>boolBinaryTree<T>:Root(T&x)constif(root)x=root->element;returntrue;elsereturnfalse;template<classT>voidBinaryTree&l
22、t;T>:MakeTree(constT&e,BinaryTree<T>&left,BinaryTree<T>&right)if(root|&left=&right)return;root=newBTNode<T>(e,left.root,right.root);left.root=right.root=NULL;template<classT>voidBinaryTree<T>:BreakTree(T&x,BinaryTree<T>&left,BinaryTr
23、ee<T>&right)if(!root|&left=&right|left.root|right.root)return;x=root->element;left.root=root->lChild;right.root=root->rChild;deleteroot;root=NULL;template<classT>voidVisit(T&x)cout<<x<<""template<classT>voidBinaryTree<T>:PreOrder
24、(void(*Visit)(T&x)PreOrder(Visit,root);template<classT>voidBinaryTree<T>二PreOrder(void(*Visit)(T&x),BTNode<T>*t)if(t)Visit(t->element);PreOrder(Visit,t->lChild);PreOrder(Visit,t->rChild);template<classT>voidBinaryTree<T>:InOrder(void(*Visit)(T&x)InO
25、rder(Visit,root);template<classT>voidBinaryTree<T>:InOrder(void(*Visit)(T&x),BTNode<T>*t)if(t)InOrder(Visit,t->lChild);Visit(t->element);InOrder(Visit,t->rChild);template<classT>voidBinaryTree<T>:PostOrder(void(*Visit)(T&x)PostOrder(Visit,root);)templat
26、e<classT>voidBinaryTree<T>:PostOrder(void(*Visit)(T&x),BTNode<T>*t)if(t)PostOrder(Visit,t->lChild);PostOrder(Visit,t->rChild);Visit(t->element);)template<classT>voidBinaryTree<T>:FloorOrder(void(*Visit)(T&x)FloorOrder(Visit,root);)template<classT>
27、voidBinaryTree<T>:FloorOrder(void(*Visit)(T&x),BTNode<T>*t)SeqQueue<BTNode<T>*>se(100);se.EnQueue(t);BTNode<T>*tmp;while(!se.IsEmpty()se.Front(tmp);Visit(tmp);se.DeQueue();if(tmp->lChild)se.EnQueue(tmp->lChild);if(tmp->Child)se.EnQueue(tmp->rChild);)temp
28、late<classT>intBinaryTree<T>:Size()(returnSize(root);)template<classT>intBinaryTree<T>:Size(BTNode<T>*t)(if(!t)return0;elsereturnSize(t->lChild)+Size(t->rChild)+1;)template<classT>voidBinaryTree<T>:Exchange()(Exchange(root);)template<classT>voidBinaryTree<T>:Exchange(BTNode<T>*t)(if(!t)return;BTNode<T>*temp;temp=t->lChild;t->lChild=t->rChild;t->rChild=temp;Exchange(t->lChild);Exchange(t->rChild);)template<classT>intBinaryTree<T>:GetHeight()(return
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建榕樹養(yǎng)護(hù)管理辦法
- 廣西發(fā)展資金管理辦法
- 常減壓裝置培訓(xùn)課件
- 股票職業(yè)交易培訓(xùn)課件教學(xué)
- 插裝閥培訓(xùn)課件
- 肝臟核磁檢查技術(shù)課件
- 高州九年級(jí)期末數(shù)學(xué)試卷
- 豆丁網(wǎng)小升初數(shù)學(xué)試卷
- 高中浦東二模數(shù)學(xué)試卷
- 甘肅省中職數(shù)學(xué)試卷
- 物聯(lián)網(wǎng)平臺(tái)介紹
- 《三國的世界》解說詞 第一集 01
- 計(jì)算機(jī)組成原理考點(diǎn)整理
- 廣東省深圳市龍華區(qū)2022-2023學(xué)年五年級(jí)下學(xué)期期末數(shù)學(xué)試卷
- 黃石市陽新縣法院系統(tǒng)書記員招聘考試真題
- 湖北省工傷職工停工留薪期分類目錄
- 教科版六下科學(xué)全冊課時(shí)練(含答案)
- 2023年主任醫(yī)師(正高)-中醫(yī)內(nèi)科學(xué)(正高)考試歷年真題精華集選附答案
- 人教版高中英語必修第二冊《Unit2Wildlifeprotection》教案及教學(xué)反思
- 內(nèi)蒙古匯能煤電集團(tuán)有限公司長灘露天煤礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- solidworks-2018安裝教程(最詳細(xì))
評(píng)論
0/150
提交評(píng)論