數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-二叉樹_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-二叉樹_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-二叉樹_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-二叉樹_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-二叉樹_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上湖南涉外經(jīng)濟學(xué)院課程設(shè)計報告課程名稱: 數(shù)據(jù)結(jié)構(gòu) 報告題目: 二叉樹的基本操作 學(xué)生姓名: 肖琳桂、康政、張小東、張帆 所在學(xué)院: 信息科學(xué)與工程學(xué)院 專業(yè)班級: 軟工本1402 學(xué)生學(xué)號: 、02、14、08 指導(dǎo)教師: 李春庭 專心-專注-專業(yè)2015 年 12 月 31 日課程設(shè)計任務(wù)書報告題目二叉樹的基本操作完成時間2周學(xué)生姓名肖琳桂 康政專業(yè)班級軟工本 1402指導(dǎo)教師李春庭職稱講師總體設(shè)計要求和主要功能設(shè)計一個程序,實現(xiàn)二叉樹的創(chuàng)建以及二叉樹的遍歷(包括先序遍歷、中序遍歷、后序遍歷和層次遍歷),計算并輸出二叉樹的深度和結(jié)點個數(shù),功能要求:1二叉樹以二叉鏈表

2、存儲,結(jié)點數(shù)據(jù)類型采用字符表示,按二叉樹的先序遍歷序列創(chuàng)建。2用文本編輯器編寫一個data.txt的文件,包含3個以上創(chuàng)建按二叉樹的先序遍歷序列(即序列中包含空樹節(jié)點),每個序列長度不少于10個,在運行程序時自動載入,也可以由鍵盤輸入創(chuàng)建二叉樹。|3菜單功能:創(chuàng)建二叉樹(二級菜單說明 選擇文件中的第幾個,輸出創(chuàng)建二叉樹的深度及結(jié)點數(shù),若失敗則有相應(yīng)提示),遍歷序列(顯示先序,中序,后序和層次遍歷結(jié)果),結(jié)點的孩子信息,退出系統(tǒng)。工作內(nèi)容及時間進度安排第17周:周1-周2 :立題、論證方案設(shè)計周3-周5 :程序設(shè)計及程序編碼第18周:周1-周3 :程序調(diào)試周4-周5 :驗收答辯摘 要本課程設(shè)計主

3、要說明如何在C+編程環(huán)境下實現(xiàn)二叉樹的遍歷,遍歷方式包括:二叉樹的先序遍歷、中序遍歷、后序遍歷,層次遍歷等四種遍歷方式。同時,此次課程設(shè)計還包括了求二叉樹深度和結(jié)點個數(shù),結(jié)點的孩子信息,以及對文件的操作,用文件讀取的方式實現(xiàn)對二叉樹的建立。以通過此次課程設(shè)計,使學(xué)生充分掌握樹的基本操作,以及對線性存儲結(jié)構(gòu)的理解。同時,在對樹的遍歷的操作過程中,同樣是運用遞歸的方式實現(xiàn)遍歷,在對樹實現(xiàn)層次操作的時候,要求用循環(huán)隊列的操作方式來實現(xiàn)層次遍歷。此次課程設(shè)計對數(shù)據(jù)結(jié)構(gòu)內(nèi)容綜合性的運用的要求較高。關(guān)鍵詞:二叉樹,先序遍歷,中序遍歷,后序遍歷,層次遍歷,節(jié)點,線性存儲, 節(jié)點的孩子信息目 錄一、需求分析1

4、問題描述設(shè)計一個二叉樹。二叉樹形象地說即樹中每個節(jié)點最多只有兩個分支,它是一種重要的數(shù)據(jù)類型??梢赃\用于建立家譜,公司所有的員工的職位圖,以及各種事物的分類和各種機構(gòu)的職位圖表等。二叉樹是通過建立一個鏈?zhǔn)酱鎯Y(jié)構(gòu),達(dá)到能夠?qū)崿F(xiàn)前序遍歷,中序遍歷,后序遍歷,層次遍歷。以及能夠從輸入的數(shù)據(jù)中得知二叉樹的葉子結(jié)點的個數(shù),二叉樹的深度。在此,二叉樹的每一個結(jié)點中必須包括:值域,左指針域,右指針域。我們抽象出下列問題:實現(xiàn)文件操作,運用文件輸入流,將已經(jīng)寫好二叉樹序列的txt文本文件,加載到程序中,實現(xiàn)文件創(chuàng)建二叉樹。然后采用鏈表存儲的方式遍歷二叉樹(先序遍歷、中序遍歷、后序遍歷、層次遍歷)。層次遍歷運

5、用循環(huán)隊列的方法實現(xiàn),需要重新定義隊頭和隊尾,以及隊列的最大長度,并且在屏幕上實現(xiàn)輸出顯示。2功能要求(1)用菜單的形式實現(xiàn)操作界面,提供(14)個功能選項,功能分別為創(chuàng)建二叉樹、遍歷序列、節(jié)點的孩子信息、退出系統(tǒng)。(2)創(chuàng)建二叉樹。要求用文件讀取和鍵盤輸入兩種不同的方式實現(xiàn)二叉樹的創(chuàng)建。二級菜單說明,輸出創(chuàng)建二叉樹的深度及結(jié)點數(shù),若失敗則有相應(yīng)提示。(3)遍歷序列。顯示先序,中序,后序和層次遍歷結(jié)果。先序遍歷、中序遍歷、后序遍歷用遞歸的方法實現(xiàn)遍歷。層次遍歷,用循環(huán)隊列的方法實現(xiàn)。(4)每次實現(xiàn)一項操作之后,要有相應(yīng)的提示返回菜單。二、概要設(shè)計1.總體設(shè)計圖主菜單遍歷序列創(chuàng)建二叉樹節(jié)點的孩子

6、信息退出系統(tǒng)2.數(shù)據(jù)結(jié)構(gòu)設(shè)計 數(shù)據(jù)元素為字符,邏輯結(jié)構(gòu)為樹形結(jié)構(gòu),存儲結(jié)構(gòu)為二叉鏈?zhǔn)酱鎯?,系統(tǒng)操作的數(shù)據(jù)元素主要是創(chuàng)建一個二叉樹,遍歷序列。3.算法設(shè)計本系統(tǒng)主要用到的算法有先序遍歷、中序遍歷、后序遍歷、層次遍歷、創(chuàng)建二叉樹和查找節(jié)點。從子菜單界面只能返回到主菜單界面,而不是退出程序。4.主要模塊及模塊之間的關(guān)系 運行程序后直接進入“菜單主界面”模塊,菜單顯示分為4個模塊,(14)分別為創(chuàng)建二叉樹、遍歷序列、節(jié)點的孩子信息、退出系統(tǒng)。主界面中的各個模塊都是獨立運行,每完成一項操作后,返回主菜單模塊。通過相應(yīng)定義的函數(shù)(外部接口)實現(xiàn),內(nèi)部數(shù)據(jù)的改變由模塊內(nèi)部完成。三、詳細(xì)設(shè)計1.結(jié)構(gòu)體(或類)

7、設(shè)計typedef char TElemType;typedef struct BiTNodeTElemType date;struct BiTNode *lchild,*rchild;BiTNode,*BiTree;2. 主要模塊實現(xiàn)的流程圖Case=1Case=2Case=4Case=33.算法設(shè)計先序遍歷:void PreOrderTraverse(BiTree T) if(T) cout<<T->date;PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild); 中序遍歷:void InOrderTr

8、aver(BiTree T) if(T) InOrderTraver(T->lchild);cout<<T->date;InOrderTraver(T->rchild); 后序遍歷:void PostOrderTraver(BiTree T) if(T) PostOrderTraver(T->lchild);PostOrderTraver(T->rchild);cout<<T->date; 層次遍歷: void ccbl(BiTNode *b) BiTNode *p; BiTNode *qMaxSize; int qm,h; qm=h

9、=-1; h+; qh=b; while(qm != h) qm=(qm+1)%MaxSize; p=qqm; printf("%c ",p->date); if(p->lchild!=NULL) h=(h+1)%MaxSize; qh=p->lchild; if(p->rchild!=NULL) h=(h+1)%MaxSize; qh=p->rchild; 四、測試運行1登錄和主界面運行效果圖2運行說明主程序運行后,直接到菜單選擇界面。其中有(14個選項可以選擇)1.創(chuàng)建二叉樹 2.遍歷序列 3.節(jié)點的孩子信息 4.退出系統(tǒng)。除退出以外,每個

10、功能模塊運行完后,返回到主菜單界面,每個界面相互獨立。3. 運行效果圖表 學(xué)生情況統(tǒng)計表序號姓名性別出生日期學(xué)號專業(yè)聯(lián)系電話備注1康政男1994.12軟件工程 組長2肖琳桂男1996.08軟件工程 3張小東男1994.07軟件工程 4張帆 男1995.08軟件工程五、結(jié)論與心得1.總體評價在此次的課程設(shè)計中,由于不夠細(xì)心,在程序設(shè)計中犯了一些錯誤,花了挺多的時間。但是經(jīng)過一番思考并且在老師的幫助下,找到了導(dǎo)致程序錯誤的原因,經(jīng)過幾次修改和調(diào)試,程序能正常運行,并且能夠完成課程設(shè)計任務(wù)中的大部分功能。同時在此次的課程設(shè)計中讓我更深刻的了解了二叉樹的基本操作,增加了對專業(yè)只是學(xué)習(xí)的興趣。我想在以后

11、的學(xué)習(xí)中,我們會繼續(xù)努力,希望在計算機方面有好的成績,也感謝老師給我們這次課程設(shè)計的機會,讓我們認(rèn)識到了自身的不足,讓我們能夠不斷地完善自己!2. 所做的工作及體會肖琳桂:編寫程序和課程設(shè)計報告。課程設(shè)計中我主要擔(dān)任程序設(shè)計的編寫和設(shè)計報告的編寫工作,經(jīng)過兩個星期的上機實踐學(xué)習(xí),使我對數(shù)據(jù)結(jié)構(gòu)有了更進一步的認(rèn)識和理解,也知道了要想學(xué)好它要重在實踐,要通過不斷的上機操作才能更好地學(xué)習(xí)它。通過實踐我發(fā)現(xiàn)我的很多不足之處,然感覺理論上已經(jīng)掌握,但在運用到實踐的過程中仍有意想不到的困惑,因為自己對知識點的掌握不夠熟悉,但通過學(xué)習(xí)有很大改進。在這次課程設(shè)計中使我知道了二又樹的先序、中序、后序、層次遍歷。

12、同時,還包括了求二叉樹深度和結(jié)點個數(shù),結(jié)點的孩子信息,以及對文件的操作,用文件讀取的方式實現(xiàn)對二叉樹的建立。充分掌握樹的基本操作,以及對線性存儲結(jié)構(gòu)的理解。也培養(yǎng)了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。在設(shè)計過程中,和同學(xué)們相互探討,相互學(xué)習(xí),相互監(jiān)督。我學(xué)會了運籌帷幌,學(xué)會了寬容,學(xué)會了理解,也學(xué)會了做人與處世,這次課程設(shè)計對找來說受益良多。在今后的日子里,我會認(rèn)真對待每一件事情,爭取做到最好,努力將知識與實踐相結(jié)合,不斷鞏固,加深所學(xué)的知識,做到學(xué)以致用。另外感謝老師的細(xì)心教導(dǎo),以及同學(xué)們的幫助。康政:編寫程序和課程設(shè)計報告。我在小組中做了編寫程序和撰寫報

13、告的工作。在編寫程序時,遇到很多困難,例如缺少聲明,調(diào)用函數(shù)錯誤等等。通過網(wǎng)上搜查,查詢資料以及老師的指點幫助,完成了很多任務(wù)。作為基礎(chǔ)不是很好的學(xué)生,我在克服自己知識不足的過程中也在努力學(xué)習(xí)新的知識,運用不同的原理編寫出不同的算法。也學(xué)習(xí)到,算法不能盲目抄襲,很多東西是不同的,必須通過自己的思考和努力的鉆研才能寫出一套完整的代碼,不可心急,越是急越不可能精細(xì)的完成任務(wù)。撰寫報告的時候,很多地方因細(xì)節(jié)問題處理不好導(dǎo)致出了大大小小很多漏洞,不能很精細(xì)的完成指定的任務(wù)。從中我也明白了,做一件事,尤其是耗時的編寫程序的問題,不能心急也不能馬虎,也許一點點出錯整個程序就會崩潰,還要重新一點點的檢查才能

14、找出問題,大大降低了辦事效率。所以,今后要做的第一件事是慢慢鞏固檢出,打好根基。第二件事是沉下心來認(rèn)真做事,不能毛手毛腳,從頭到尾認(rèn)真細(xì)致的做下去,避免出錯惹出更多的麻煩。這次的程序設(shè)計使我受益匪淺,學(xué)到了很多,做了很多。希望以后可以更多的做這種任務(wù),鞏固知識,學(xué)習(xí)新的知識,有了這些經(jīng)驗可以做的更好。張小東:查找資料和打印。這次我在小組中做的事情是查詢資料和打印排版。雖然因為我的專業(yè)底子差一點,現(xiàn)在暫時只能在程序設(shè)計時查找一些需要用到的專業(yè)資料,幫助組員完成設(shè)計,但我相信下一次我不會僅此于此。這次程序設(shè)計我的收獲還是很大了,讓我懂得了學(xué)好專業(yè)知識,并不是自己想象中的難,而是你自己是否去努力了。

15、在查找資料的過程中,我是邊查邊學(xué)自己不會的知識點。查找途中也遇到了一些當(dāng)時不能理解的知識點,但經(jīng)過同學(xué)的細(xì)心解答,最后一些難掌握的知識點都被基本掌握。這讓我懂得編程過程需要很大的耐心,而且要有良好的思維和扎實的專業(yè)基礎(chǔ)知識,所以我需要努力的學(xué)習(xí),發(fā)現(xiàn)自身不足之處并努力改正他,逐步提高自身的能力,不斷取得進步。通過這次課程設(shè)計,我認(rèn)識到知識運用的重要性,并且努力加深對基礎(chǔ)知識的理解,從中了解自己需要學(xué)習(xí)的東西并學(xué)會自學(xué)。作為一名計算機專業(yè)的學(xué)生,今后我會加緊學(xué)習(xí),學(xué)好專業(yè)知識,為將來打下堅實的基礎(chǔ)。張帆:查找資料和打印。這次我在小組中做的事情是查詢資料,打印排版。雖然這些工作并不是主要任務(wù),但是

16、我用心對待,認(rèn)真為做程序的同學(xué)查找資料,為他們挑選所需要的代碼以及算法,及時反饋給他們信息。因為基礎(chǔ)不是很好,經(jīng)常會剪裁到一些不是很合適的代碼,我們通過共同分析,共同篩選,最終也獲得了很多收獲。通過和他們一起分析代碼,我也漲了很多知識。懂的了二叉樹的算法,數(shù)據(jù)類型等等。報告的排版也是一項需要耐心的工作,通過晚上的時間,我認(rèn)認(rèn)真真的對所寫的設(shè)計報告進行了排版,把一些不符合文本框架或者有代碼錯誤的都進行了細(xì)致的修改,保證了設(shè)計報告的質(zhì)量。從這次的程序設(shè)計中,我學(xué)到了很多。認(rèn)認(rèn)真真做一件事情不會有錯,用什么態(tài)度做什么事會得到什么樣的回報。并且我認(rèn)為數(shù)據(jù)結(jié)果也不是很難的科目,認(rèn)真花時間去琢磨一定不會落

17、下很多。所以以后我會細(xì)致做事,并在閑暇時間補習(xí)功課,爭取盡快補習(xí)好原來的知識,再學(xué)習(xí)新的知識為自己充電。六、程序附錄(源代碼)#include<iostream>#include<fstream>#include<stdlib.h>using namespace std;typedef char TElemType;#define MaxSize 1000 int i;typedef struct BiTNodeTElemType date;struct BiTNode *lchild,*rchild;BiTNode,*BiTree;void Destory

18、(BiTree &T);/函數(shù)聲明char input255;void Interface();void sjecs(BiTree &T);void jp(BiTree &T);/鍵盤void wj(BiTree &T);/文件void CreateBiTree(BiTree &T);int Count(BiTree T);int Deep(BiTree T);void PreOrderTraverse(BiTree T);/先序void InOrderTraver(BiTree T);/中序void PostOrderTraver(BiTree T);

19、/后序void ccbl(BiTNode *b);/層次遍歷void blxljm();void locate(BiTree T,char x);void main()/主函數(shù)Interface();BiTree T=NULL;bool End=false;char sel;char x;int p=1;int q=1;doInterface();fflush(stdin);char select=cin.get();system("cls");switch(select)case'1':cout<<"創(chuàng)建二叉樹:n"sjec

20、s(T);break;case'2': cout<<"nt遍歷序列n"doblxljm();cout<<"n選擇:"fflush(stdin);sel=cin.get();p=1;switch(sel)case'1':cout<<"n先序遍歷二叉樹的輸出順序:n"PreOrderTraverse(T);cout<<"n"system("pause");system("cls");break;cas

21、e'2': cout<<"n中序遍歷二叉樹的輸出順序:n"InOrderTraver(T);cout<<"n"system("pause");system("cls");break; case'3': cout<<"n后序遍歷二叉樹的輸出順序:n"PostOrderTraver(T);cout<<"n"system("pause");system("cls"

22、);break; case'4': cout<<"n層次遍歷二叉樹的輸出順序:n" ccbl(T);cout<<"n"system("pause");system("cls");break; case'5': p=0;while(p);break;case'3': do system("cls");q=1;cout<<"n-結(jié)點的孩子信息:-n" cout<<"(如果節(jié)點

23、不存在,不返回任何信息,按任意鍵返回子菜單)n" cout<<"輸入要查找的節(jié)點:" cin>>x; locate(T,x);system("pause");system("cls"); cout<<"n-菜單信息:-n"cout<<"nt0.輸入返回主菜單n"cout<<"t1.繼續(xù)查找節(jié)點n"docout<<"t請選擇:"cin>>q;if(q!=0&

24、&q!=1) cout<<"輸入格式不對請重新輸入n"while(q!=0&&q!=1);while(q);break;case'4':End=true;system("pause");while(!End);void locate(BiTree T,char x) / 在二叉樹T中查找值為x的節(jié)點BiTree p;p=T; if(T=NULL) return;else if(T->date=x) cout<<p->date; if(T->lchild)cout<&l

25、t;"t"<<"節(jié)點的左孩子:"<<T->lchild->date<<"n"else cout<<"t"<<"節(jié)點沒有左孩子n"if(T->rchild)cout<<"t節(jié)點的右孩子:"<<T->rchild->date<<"n"else cout<<"t"<<"節(jié)點沒有右孩子n

26、"else p=T->lchild;if(p) locate(T->lchild,x);locate(T->rchild,x);void Interface()/菜單界面函數(shù)system("cls");cout<<"nt-遍歷序列-n"cout<<"tt1.創(chuàng)建二叉樹n"cout<<"tt2.遍歷序列n"cout<<"tt3.結(jié)點的孩子信息n"cout<<"tt4.退出系統(tǒng)n"cout&l

27、t;<"tt請選擇(14):"cout<<"nt-n"void blxljm()/遍歷序列界面函數(shù)system("cls");cout<<"nt-二叉樹-n" cout<<"t(如果沒創(chuàng)建二叉樹,不返回任何信息,按5返回主菜單)n"cout<<"tt1.先序遍歷二叉樹n"cout<<"tt2.中序遍歷二叉樹n"cout<<"tt3.后序遍歷二叉樹n"cout&

28、lt;<"tt4.層次遍歷二叉樹n"cout<<"tt5.返回主菜單n"cout<<"tt請選擇(15):"cout<<"nt-n"int Count(BiTree T)/計算節(jié)點數(shù)量if(T=NULL)return 0;return 1+Count(T->lchild)+Count(T->rchild);int Deep(BiTree T)/計算二叉樹的度if(T=NULL)return 0;int u=Deep(T->lchild);int v=Dee

29、p(T->rchild);if(u>v)return (u+1);return (v+1);void sjecs(BiTree &T)/選擇輸入模式,新建二叉樹bool End=false;if(T)Destory(T);T=NULL;cout<<"請選擇輸入二叉樹序列模式:(1:鍵盤輸入 2.文件輸入 3.返回主菜單)"<<endl;dochar Selection=cin.get();switch( Selection)case'1': jp(T);break;case'2':wj(T);bre

30、ak;case'3':End=true;while (!End);void jp(BiTree &T)/鍵盤輸入cout<<"輸入按先序建立二叉樹結(jié)點序列:t"cout<<"例如:ABDECFHGIJn"cout<<"輸入:"cin>>input;int i=0;CreateBiTree(T);int num=Count(T);int deep=Deep(T);cout<<" 二叉樹創(chuàng)建成功!n"cout<<"

31、 此二叉樹共有"<<num<<"個結(jié)點n"cout<<" 且該二叉樹的深度為:" <<deep<< " (按3返回主菜單界面)n"cout<<"請輸入選項:"void wj(BiTree &T)/文件輸入 ifstream fi("a.txt");if(!fi)cout<<"數(shù)據(jù)文件不存在!n"exit(0);fi>>input;int i=0;CreateBiTree(T);int num=Count(T);int deep=Deep(T);cout<<" 二叉樹創(chuàng)建成功!n"cout<<" 此二叉樹共有"<<num<<"個結(jié)點n"cout<<" 且該二叉樹的深度為:" <<deep<< " (按3返回主菜單界面)n"cout<<"請

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論