版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)(論文)</b></p><p> 題 目: 可視化走迷宮游戲 </p><p> 院 (系): </p><p> 專業(yè)班級(jí): </p><p> 姓 名:
2、 </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 2011年9月15日</p><p> 課程設(shè)計(jì)(論文)任務(wù)書</p><p> 專業(yè)班級(jí): 計(jì)算機(jī)901 學(xué)生姓名: 指導(dǎo)教師(簽名
3、): </p><p><b> 摘要</b></p><p> 本設(shè)計(jì)是為了實(shí)現(xiàn)一個(gè)可視化迷宮,以及利用最短路徑算法尋找迷宮的出路以及將最短路徑打印在屏幕上,并且限制小老鼠不能穿越墻,只能在路徑上移動(dòng)。而且可以根據(jù)自己的需要設(shè)計(jì)迷宮地圖。</p><p><b> 關(guān)鍵詞:mfc </b><
4、;/p><p><b> 目 錄</b></p><p> 一.設(shè)計(jì)目的........................................................................................1</p><p> 二.問(wèn)題描述............................
5、...........................................................1</p><p> 三.需求分析.......................................................................................1</p><p> 四.概要設(shè)計(jì)..............
6、..........................................................................2</p><p> 五.詳細(xì)設(shè)計(jì).......................................................................................4</p><p> 六.測(cè)試分
7、析……………………………………………………....27</p><p> 七.使用說(shuō)明……………………………………...........................36</p><p> 八.總結(jié)............................................................................................37
8、</p><p> 九.參考文獻(xiàn)....................................................................................38</p><p> 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)—二叉樹的遍歷及樹與二叉樹的轉(zhuǎn)換</p><p><b> 一.設(shè)計(jì)目的</b></p&g
9、t;<p> 通過(guò)課程設(shè)計(jì),鞏固所學(xué)的理論知識(shí),培養(yǎng)綜合運(yùn)用所學(xué)知識(shí)解決實(shí)際問(wèn)題的能力。能根據(jù)實(shí)際問(wèn)題的具體情況,結(jié)合數(shù)據(jù)結(jié)構(gòu)課程中的基本理論和基本算法,正確分析出數(shù)據(jù)的邏輯結(jié)構(gòu),合理地選擇相應(yīng)的存儲(chǔ)結(jié)構(gòu),并能設(shè)計(jì)出解決問(wèn)題的有效算法。</p><p><b> 二.問(wèn)題描述</b></p><p><b> 1.地圖要求:</b&
10、gt;</p><p> 根據(jù)要求構(gòu)造一個(gè)迷宮地圖,并且是老鼠清晰可見,可用鍵盤操縱老鼠上下左右移動(dòng);有一個(gè)窗口顯示部分地圖,另一個(gè)窗口顯示全部題圖。</p><p><b> 2.操作:</b></p><p> 老鼠不能穿墻而過(guò),當(dāng)老鼠到達(dá)糧倉(cāng)提示成功??梢宰詣?dòng)找到迷宮的所有路徑以及畫出最短路徑。</p><p&g
11、t;<b> 三.需求分析</b></p><p> 1.利用mfc可以把迷宮地圖以及老鼠形象可變的畫出來(lái)。</p><p> 2.需要有墻有路,通過(guò)把迷宮地圖劃分成一個(gè)一個(gè)小方塊,通過(guò)一個(gè)數(shù)組的值來(lái)判斷是墻是路。(1表示墻0表示路)</p><p> 3.通過(guò)鼠標(biāo)事件控制老鼠的移動(dòng)。</p><p> 4.把
12、每個(gè)數(shù)組元素對(duì)應(yīng)一個(gè)按鈕根據(jù)點(diǎn)擊按鈕,改變數(shù)組的值從而改變墻和路的轉(zhuǎn)化。</p><p><b> 四.概要設(shè)計(jì)</b></p><p><b> 圖1 程序界面圖</b></p><p><b> 4.1、操作界面</b></p><p> 利用mfc單文檔初始化界
13、面,設(shè)置meau選項(xiàng),以及分割成大小兩個(gè)窗口。</p><p> 4.2、用戶的登陸界面</p><p> 利用對(duì)話框設(shè)計(jì)用戶登陸界面,界面包括用戶名,選擇的迷宮級(jí)別。</p><p><b> 4.3、地圖的繪制</b></p><p> 根據(jù)登陸界面的上面的信息,繪制迷宮地圖。選擇加載全圖菜單會(huì)顯示迷宮總圖。
14、</p><p> 4.4、游戲音樂(lè)的設(shè)置</p><p> 在迷宮加載之后,播放背景音樂(lè),利用多線程異步播放。</p><p> 4.5、小老鼠鍵盤操作</p><p> 利用鍵盤事件,完成小老鼠的操作。</p><p> 4.6、全圖與部分的同步</p><p> 利用CFram
15、eWnd類實(shí)現(xiàn)兩個(gè)view類的同步操作。</p><p> 4.7、搜索迷宮路徑及最短路徑的顯示</p><p> 選擇‘路徑‘菜單利用遞歸搜索出迷宮所有路徑并且把最短路徑繪制在全圖顯示中。</p><p> 4.8、編輯迷宮地圖</p><p> 利用對(duì)話框中每一個(gè)按鈕對(duì)用迷宮的一部分,編輯迷宮地圖。</p><
16、p> 4.9、層次序遍歷算法</p><p> 按照樹的層次從左到右訪問(wèn)樹的結(jié)點(diǎn),層序遍歷用于保存結(jié)點(diǎn)的容器是隊(duì)列。void LevelOrder(BiNode root)。</p><p> 4.10、樹與二叉樹的轉(zhuǎn)換算法</p><p> 轉(zhuǎn)換時(shí)結(jié)點(diǎn)的第一個(gè)孩子變?yōu)樗淖蠛⒆樱值芄?jié)點(diǎn)變?yōu)樗挠泻⒆?。void exchange(),class T
17、ree。</p><p><b> 4.11、結(jié)束界面</b></p><p> 利用選繼續(xù)還是結(jié)束游戲作為結(jié)束畫面,點(diǎn)擊繼續(xù)級(jí)別將自動(dòng)加1.</p><p><b> 五.詳細(xì)設(shè)計(jì)</b></p><p> 5.1、各模塊流程圖 </p><p><b>
18、 圖1 游戲界面顯示</b></p><p><b> 圖2 小老鼠操作</b></p><p> 圖3、全圖與部分圖的同步</p><p> 圖4、迷宮路徑以及最短路徑</p><p><b> 圖5、后序遞歸遍歷</b></p><p> 圖6、前
19、序非遞歸遍歷</p><p> 圖 7、中序非遞歸遍歷</p><p> 圖8、后序非遞歸遍歷</p><p> 圖9、層次序非遞歸遍歷</p><p><b> 5.2、源程序</b></p><p><b> 我真誠(chéng)地保證:</b></p><
20、;p> 我自己獨(dú)立地完成了整個(gè)程序從分析、設(shè)計(jì)到編碼的全過(guò)程。</p><p> 如果在上述過(guò)程中,我遇到了困難而求教于人,那么,我將在程序報(bào)告中詳細(xì)地列舉我所遇到的問(wèn)題,以及別人給我的提示。</p><p> 我的程序里中凡是引用到其他程序或文檔之處,例如教材、課堂筆記、網(wǎng)上的源代碼以及其他參考書上的代碼段,我都已經(jīng)在程序的注釋里很清楚地注明了引用的出處。</p>
21、<p> 我從未抄襲過(guò)別人的程序,也沒(méi)有盜用別人的程序,無(wú)論是修改式地抄襲還是原封不動(dòng)地抄襲。</p><p> 我編寫這個(gè)程序,從來(lái)沒(méi)有想過(guò)要去破壞或妨礙其他計(jì)算機(jī)系統(tǒng)的正常運(yùn)轉(zhuǎn)。</p><p> #include<iostream></p><p> using namespace std;</p><p&
22、gt; #include<stdlib.h> </p><p> #include<math.h> </p><p> #include <windows.h> //包涵暫停函數(shù)的頭文件 </p><p> #define maxIsize 100
23、</p><p> #include "tree.h"</p><p> #define LEN sizeof(struct btree) </p><p> int maxI=1; </p><p> typedef struct btree //二叉樹節(jié)點(diǎn)結(jié)構(gòu)體</p><p><
24、b> {</b></p><p> btree *lchild,*rchild; </p><p> char data; </p><p> }*BiNode; </p><p> typedef struct StackElemType//棧的結(jié)構(gòu)體</p><p><b>
25、 {</b></p><p> BiNode ptr;</p><p><b> int flag;</b></p><p> }StackElemType;</p><p> BiNode p ;</p><p><b> //二叉樹的建立</b>&
26、lt;/p><p> BiNode stree_creat(char *a,int k) </p><p><b> {</b></p><p> BiNode root; maxI++;</p><p> if(a[k]=='\0'||k>maxIsize) </p><p
27、> return NULL; //判斷樹是否為空</p><p><b> else </b></p><p><b> {</b></p><p> root=(BiNode)malloc(LEN);//動(dòng)態(tài)申請(qǐng)節(jié)點(diǎn)</p><p> root->data=a[k]; <
28、;/p><p> root->lchild=stree_creat(a,2*k+1); //遞歸調(diào)用為左孩子賦值</p><p> root->rchild=stree_creat(a,2*k+2); //遞歸調(diào)用為右子賦值</p><p> return root;//返回根節(jié)點(diǎn)指針</p><p><b> }
29、</b></p><p><b> } </b></p><p> void print(BiNode root) //輸出所創(chuàng)建的二叉樹</p><p><b> { </b></p><p> BiNode h[maxIsize]={NULL}; </p>&l
30、t;p> double top=0,j=0,m=0;</p><p> int base=0,n=0,k=0,topInt=0;</p><p> h[topInt]=root;</p><p> j=log(maxI+1)/log(2)-1;</p><p> if(pow(2,j+1)-1<maxI) j++;<
31、;/p><p> cout<<"你剛輸入的是:\n"; </p><p> while(h[base]!=NULL) //把二叉樹的值依次存入數(shù)組</p><p><b> { </b></p><p> h[++topInt]=h[base]->lchild; </p&g
32、t;<p> h[++topInt]=h[base]->rchild; </p><p><b> base++; </b></p><p><b> } </b></p><p> for(topInt=0,top=0;h[k]!=NULL;topInt++)//按層輸出</p>
33、<p><b> { </b></p><p> m=pow(2,j)-top;//計(jì)算每行輸出的空格數(shù)</p><p> if(top!=0) m=m-top;</p><p> for(n=0;n<m;n++) </p><p> cout<<" ";<
34、;/p><p> for(base=0;base<pow(2,top)&&h[k]!=NULL;base++)//控制每層輸出的個(gè)數(shù)</p><p><b> {</b></p><p> if(h[k]->data=='0') cout<<"["<<&q
35、uot;]";//當(dāng)為空時(shí)輸出[]</p><p> else cout<<h[k]->data<<" ";</p><p><b> k++;</b></p><p><b> }</b></p><p> cout<<
36、;"\n";</p><p> for(n=0;n<(m-1);n++) </p><p> cout<<" ";</p><p> for(base=0;base<pow(2,top)&&h[k]!=NULL;base++)</p><p> cout&
37、lt;<"/"<<"| "; </p><p> cout<<"\n";</p><p><b> top += 1;</b></p><p><b> } </b></p><p><b>
38、 } </b></p><p> //二叉樹的后序遍歷遞歸算法</p><p> void PostOrder(BiNode root)</p><p><b> {</b></p><p> if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p>&
39、lt;b> else</b></p><p><b> {</b></p><p> PostOrder(root->lchild);</p><p> PostOrder(root->rchild);</p><p> if(root->data=='0')
40、 ;</p><p> else cout<<"["<<root->data<<"]";</p><p><b> }</b></p><p><b> }</b></p><p> //二叉樹的中序遍歷遞歸
41、算法</p><p> void InOrder(BiNode root)</p><p><b> {</b></p><p> if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p><b> else</b></p><p><b
42、> {</b></p><p> InOrder(root->lchild);</p><p> if(root->data=='0') ;</p><p> else cout<<"["<<root->data<<"]";&l
43、t;/p><p> InOrder(root->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> //二叉樹的前序遞歸遍歷算法</p><p> void PreOrder(BiNode root){&
44、lt;/p><p> if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p><b> else</b></p><p><b> { </b></p><p> if(root->data=='0') ;</p><p>
45、;<b> else</b></p><p> cout<<"["<<root->data<<"]";</p><p> PreOrder(root->lchild);</p><p> PreOrder(root->rchild);</
46、p><p><b> }</b></p><p><b> }</b></p><p> //二叉樹的前序遍歷非遞歸算法 </p><p> void F_PreOrder(BiNode root)</p><p><b> {</b></p
47、><p> BiNode s[maxIsize];//申請(qǐng)一個(gè)BiNode數(shù)組</p><p> int top=0;//采用順序棧,并假定不會(huì)發(fā)生上溢</p><p><b> do{</b></p><p> while(root!=NULL)//當(dāng)結(jié)點(diǎn)不為空時(shí)</p><p><b
48、> {</b></p><p> if(root->data=='0') ;</p><p><b> else</b></p><p> cout<<"["<<root->data<<"]";</p>
49、<p> s[++top]=root;//依次將結(jié)點(diǎn)壓入棧</p><p> root=root->lchild;//根賦值為它的左孩子</p><p><b> }</b></p><p> if(top>0)//當(dāng)節(jié)點(diǎn)為空但棧頂不為零時(shí)</p><p><b> {<
50、;/b></p><p> root=s[top--];//棧頂下移把棧頂元素負(fù)給根結(jié)點(diǎn)</p><p> root=root->rchild; //根賦值為它的右子</p><p><b> }</b></p><p> }while(root!=NULL||top>0);</p>
51、<p><b> }</b></p><p> //中序非遞歸遍歷算法</p><p> void F_inOrder(BiNode root)</p><p><b> {</b></p><p> BiNode s[maxIsize]; //申請(qǐng)一個(gè)BiNode數(shù)組&
52、lt;/p><p> int top=0; //采用順序棧,并假定不會(huì)發(fā)生上溢</p><p><b> do{</b></p><p> while(root!=NULL) //當(dāng)結(jié)點(diǎn)不為空時(shí)</p><p><b> {</b></p><p> s[++top]
53、= root; //依次將結(jié)點(diǎn)壓入棧</p><p> root = root->lchild; //根賦值為它的左孩子</p><p><b> }</b></p><p> if(top>0) //當(dāng)節(jié)點(diǎn)為空但棧頂不為零時(shí)</p><p><b> {</b></p&g
54、t;<p> root = s[top]; //把棧頂元素負(fù)給根結(jié)點(diǎn)</p><p> if(root->data=='0') ;</p><p> else cout<<"["<<root->data<<"]";//輸出根結(jié)點(diǎn)</p><p&
55、gt; root=s[top--];//棧頂下移把棧頂元素負(fù)給根結(jié)點(diǎn)</p><p> root=root->rchild; //根賦值為它的右子</p><p><b> }</b></p><p> }while(root!=NULL||top>0);</p><p><b> } &
56、lt;/b></p><p> //后序非遞歸遍歷算法</p><p> void F_PostOrder(BiNode root)</p><p><b> {</b></p><p> //申請(qǐng)一個(gè)StackElemType數(shù)組</p><p> StackElemType s
57、[maxIsize];</p><p> BiNode p=root;</p><p> int top = 0;</p><p><b> do{</b></p><p> while(p!=NULL) //當(dāng)結(jié)點(diǎn)不為空時(shí)</p><p><b> {</b>&l
58、t;/p><p> s[top].flag = 0;//標(biāo)記位負(fù)為零</p><p> s[top].ptr = p;//將樹的結(jié)點(diǎn)依次壓入棧中</p><p> p=p->lchild;//樹沿左子樹下移</p><p><b> top++;</b></p><p><b>
59、; } </b></p><p> while(s[top-1].flag == 1)//當(dāng)棧的最上面元素標(biāo)記位為一時(shí)輸出</p><p> { if( s[top-1].ptr->data=='0') top--;</p><p><b> else</b></p><p
60、> cout<<"["<<s[--top].ptr->data<<"]";</p><p><b> }</b></p><p> if(top>0) //當(dāng)節(jié)點(diǎn)為空但棧頂不為零時(shí)</p><p><b> {</b>&l
61、t;/p><p> s[top-1].flag = 1; //棧的最上面元素標(biāo)記位賦值為一</p><p> p = s[top-1].ptr; //棧的最上面元素樹結(jié)點(diǎn)賦給p</p><p> p = p->rchild;//樹沿右子樹下移</p><p><b> }</b></p><
62、p> }while(top>0);</p><p><b> }</b></p><p><b> //層序遍算法</b></p><p> void LevelOrder(BiNode root)</p><p><b> {</b></p>
63、;<p> BiNode s[maxIsize]; //申請(qǐng)一個(gè)BiNode數(shù)組</p><p> int maxI,i=0; </p><p> s[0]= root;//數(shù)組首元賦為根結(jié)點(diǎn)</p><p> while(root!=NULL)//當(dāng)結(jié)點(diǎn)不空時(shí)</p><p><b> {</b>
64、;</p><p> s[2*i+1] = root->lchild;//左孩子賦給下標(biāo)為2*i+1的數(shù)組員</p><p> s[2*i+2] = root->rchild; //右孩子賦給下標(biāo)為2*i+1的數(shù)組員</p><p><b> i++;</b></p><p> root = s[i]
65、;//root變?yōu)楫?dāng)前數(shù)組元素的值</p><p><b> maxI = i;</b></p><p><b> }</b></p><p> for( i=0;i<maxI;i++)</p><p><b> {</b></p><p>
66、; if(s[i]->data=='0') ;</p><p><b> else</b></p><p> cout<<"["<<s[i]->data<<"]";//依次輸出</p><p><b> }</b&g
67、t;</p><p><b> }</b></p><p> void Pause()</p><p><b> {</b></p><p> cout<<endl<<endl<<endl;</p><p> system(&qu
68、ot;pause");</p><p> cout<<endl<<endl<<endl;</p><p><b> } </b></p><p><b> //樹轉(zhuǎn)換為二叉樹</b></p><p> void exchange(){</p
69、><p> Tree<char> myTree1;//實(shí)例化一個(gè)Tree class</p><p> myTree1.InputTree();//調(diào)用InputTree()函數(shù)</p><p><b> Pause();</b></p><p> myTree1.ShowTree();//調(diào)用ShowT
70、ree()函數(shù)</p><p><b> Pause();</b></p><p> myTree1.Show_BinaryTree();//調(diào)用Show_BinaryTree()函數(shù)</p><p><b> Pause();</b></p><p><b> }</b&g
71、t;</p><p> //輸入二叉樹信息的函數(shù)</p><p> BiNode creat()</p><p><b> { </b></p><p> BiNode p=NULL ;</p><p> cout<<"請(qǐng)輸入你的二叉樹(請(qǐng)按層次由上往下從左到右依次
72、輸入并按#結(jié)束,如果節(jié)點(diǎn)為空請(qǐng)輸入'0',本遍歷器僅支持單字符),輸入為:\n";</p><p> int i=0,j=0; </p><p> char b[maxIsize]={'#'},n ;</p><p> //當(dāng)輸入不為'#'時(shí)給數(shù)組賦值</p><p><b
73、> do{ </b></p><p><b> cin>>n;</b></p><p> if(n!='#') b[i]=n;</p><p><b> i++;</b></p><p> }while(n!='#');<
74、;/p><p> p=stree_creat(b,0);//創(chuàng)建樹</p><p> print(p);//輸出樹</p><p><b> return p;</b></p><p><b> }</b></p><p> void welcome(){</p&
75、gt;<p> for(int i=0;i<3;i++)</p><p><b> {</b></p><p> system("cls"); //執(zhí)行DOS下的清屏命令</p><p> cout<<"\n\n\n\n\n\n\n\
76、n\n\n\t\t\tloading";</p><p> for(int j=0;j<10;j++)</p><p><b> {</b></p><p> Sleep(80);</p><p> cout<<".";</p><p>&l
77、t;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void end(){</p><p> system("cls");</p><p> cout<&l
78、t;"\n\n\n\n"<<endl;</p><p> cout<<"\n\t\t\t********************"<<endl;</p><p> cout<<"\n\t\t\t* *"<<endl;</p>
79、;<p> cout<<"\n\t\t\t* 感謝您的使用! *"<<endl;</p><p> cout<<"\n\t\t\t* Goodbye! *"<<endl;</p><p> cout<<"\n\t\t\t*
80、 *"<<endl;cout<<"\n\t\t\t********************\n\n\n\n\n\n\n\t\t\t"<<endl;</p><p><b> exit(0);</b></p><p><b> }</b></p>
81、<p><b> //主函數(shù)</b></p><p> int main()</p><p><b> {</b></p><p><b> int k;</b></p><p> welcome();</p><p><b
82、> do{</b></p><p> system("cls");</p><p> cout<<"\n ";</p><p> cout<<"\n __________________________________________________________
83、__________________ ";</p><p> cout<<" | 歡迎使用樹的多種遍歷器 |";</p><p> cout<<" | 樹與
84、二叉樹的轉(zhuǎn)換 |";</p><p> cout<<" | |";</p><p> cout<<" |_____
85、_______________________________________________________________________| \n";</p><p> cout<<"\n ";</p><p> cout<<"\n 1.創(chuàng)建二叉樹 ";</
86、p><p> cout<<"\n 2.查看二叉樹";</p><p> cout<<"\n 3.前序遞歸遍歷算法 ";</p><p> cout<<"\n
87、 4.中序遞歸遍歷算法 ";</p><p> cout<<"\n 5.后序遞歸遍歷算法 ";</p><p> cout<<"\n 6.前序非遞歸遍歷算法 ";</p><p>
88、cout<<"\n 7.中序非遞歸遍歷算法 ";</p><p> cout<<"\n 8.后序非遞歸遍歷算法 "; </p><p> cout<<"\n 9.層
89、序非遞歸遍歷算法 ";</p><p> cout<<"\n 10. 樹與二叉樹的轉(zhuǎn)換";</p><p> cout<<"\n 11.退出操作\n";</p><p> cout<<&q
90、uot;請(qǐng)選擇你要進(jìn)行的操作(數(shù)字鍵):";</p><p><b> cin>>k; </b></p><p> system("cls");</p><p> cout<<"\n ";</p><p> cout<<&qu
91、ot;\n ____________________________________________________________________________ ";</p><p> cout<<" | 歡迎使用樹的多種遍歷器 |";</p>&
92、lt;p> cout<<" | 樹與二叉樹的轉(zhuǎn)換 |";</p><p> cout<<" |
93、 |";</p><p> cout<<" |____________________________________________________________________________| \n";</p><p> switch(k){</p><p><b> case 1:{&
94、lt;/b></p><p> p=creat();//調(diào)用creat()創(chuàng)建二叉樹</p><p><b> Pause();</b></p><p><b> }break;</b></p><p><b> case 2:{</b></p>&
95、lt;p><b> print(p);</b></p><p><b> Pause();</b></p><p><b> }break;</b></p><p><b> case 3:{</b></p><p><b> p
96、rint(p);</b></p><p> cout<<"二叉樹的前序遞歸遍歷 :";</p><p> PreOrder(p);//調(diào)用PreOrder(p)前序遍歷</p><p><b> Pause();</b></p><p><b> } brea
97、k; </b></p><p><b> case 4:{</b></p><p><b> print(p);</b></p><p> cout<<"二叉樹的中序遞歸遍歷 :";</p><p> InOrder(p); //調(diào)用InOrder
98、(p)中序遍歷</p><p><b> Pause();</b></p><p><b> } break;</b></p><p><b> case 5:{</b></p><p><b> print(p);</b></p>
99、<p> cout<<"二叉樹的后序遞歸遍歷 :";</p><p> PostOrder(p); //調(diào)用PostOrder(p) 后序遍歷</p><p><b> Pause();</b></p><p><b> } break;</b></p>&l
100、t;p><b> case 6:{</b></p><p><b> print(p);</b></p><p> cout<<"二叉樹前序非遞歸遍歷:";</p><p> F_PreOrder(p); //調(diào)用F_PreOrder(p)前序遍歷</p><
101、;p><b> Pause();</b></p><p><b> }break;</b></p><p><b> case 7:{</b></p><p><b> print(p);</b></p><p> cout<<
102、"二叉樹中序非遞歸遍歷:";</p><p> F_inOrder(p); //調(diào)用F_inOrder(p) 中序遍歷</p><p><b> Pause();</b></p><p><b> }break;</b></p><p><b> case 8:
103、{</b></p><p><b> print(p);</b></p><p> cout<<"二叉樹后序非遞歸遍歷:";</p><p> F_PostOrder(p);</p><p><b> Pause();</b></p>
104、<p><b> }break;</b></p><p><b> case 9:{</b></p><p><b> print(p);</b></p><p> cout<<"二叉樹層序非遞歸遍歷:";</p><p>
105、 LevelOrder(p);</p><p><b> Pause();</b></p><p><b> }break;</b></p><p> case 10:{ </p><p> exchange();//調(diào)用exchange() 實(shí)現(xiàn)樹與二叉樹的轉(zhuǎn)換</p&
106、gt;<p><b> }break;</b></p><p><b> case 11:{</b></p><p><b> end()</b></p><p><b> }break;</b></p><p><b>
107、; default:</b></p><p> cout<<"您的輸入有誤!按任意鍵繼續(xù)......";</p><p> Pause();</p><p><b> } </b></p><p> }while(1);</p><p&
108、gt;<b> }</b></p><p><b> 六.測(cè)試分析</b></p><p> 二叉樹遍歷中用到的最重要的一個(gè)思想就是遞歸調(diào)用,這次作業(yè)是我對(duì)遞歸有了更深入的理解,尤其是對(duì)退回上一層后應(yīng)執(zhí)行的語(yǔ)句和結(jié)點(diǎn)位置的思路更加清晰。程序調(diào)試比較順利。</p><p> 用棧同樣可以實(shí)現(xiàn)二叉樹的遍歷,這使我認(rèn)識(shí)到
109、解決一個(gè)問(wèn)題可以有多種不同的途徑,應(yīng)隨時(shí)將以前學(xué)過(guò)的知識(shí)靈活應(yīng)用起來(lái),解決新的問(wèn)題。在使用棧結(jié)構(gòu)時(shí),為了方便,我采用了二叉樹結(jié)構(gòu),將其與鏈?zhǔn)綏=Y(jié)合起來(lái)。 </p><p> 因?yàn)楸闅v二叉樹的基本操作是訪問(wèn)結(jié)點(diǎn),所以無(wú)論哪一種遍歷方式,對(duì)含有n個(gè)結(jié)點(diǎn)的二叉樹,其時(shí)間復(fù)雜度為O(n),所需輔助空間最大容量為樹的深度,最壞為n,所以空間復(fù)雜度為O(n)。</p><p> 因該程序?qū)?yīng)不同的
110、遍歷定義了不同的結(jié)構(gòu),使每種結(jié)構(gòu)的通用性降低,可以在遞歸和非遞歸中使用同一種結(jié)構(gòu)這一方面作進(jìn)一步的思考。</p><p><b> 6.1、測(cè)試目的</b></p><p> 測(cè)試該程序是否完成所有功能,以及程序存在的不足。</p><p><b> 6.2、測(cè)試數(shù)據(jù)</b></p><p>
111、<b> 1234567</b></p><p><b> 6.3、測(cè)試結(jié)果</b></p><p> 圖10、開始過(guò)度界面</p><p><b> 圖11、開始菜單</b></p><p><b> 圖12、創(chuàng)建二叉樹</b></p&g
112、t;<p><b> 圖13、查看二叉樹</b></p><p> 圖14、二叉樹的前序遞歸遍歷</p><p> 圖15、二叉樹的中序遞歸遍歷</p><p> 圖16、二叉樹的后序遞歸遍歷</p><p> 圖17、二叉樹的前序非遞歸遍歷</p><p> 圖18、二
113、叉樹的中序非遞歸遍歷</p><p> 圖19、二叉樹的后序非遞歸遍歷</p><p> 圖20、層序非遞歸遍歷</p><p> 圖21、輸入要建立樹的信息</p><p> 圖22、輸出樹的形狀</p><p> 圖23、輸出轉(zhuǎn)換成的二叉樹的形狀</p><p><b>
114、 圖24、結(jié)束界面</b></p><p><b> 七.使用說(shuō)明</b></p><p> 運(yùn)行程序,首先出現(xiàn)主界面。主界面有十一個(gè)選項(xiàng)。</p><p> 選項(xiàng)一,選擇此選項(xiàng)進(jìn)行二叉樹的創(chuàng)建。按層輸入樹的信息,如果為空輸入零。</p><p> 選項(xiàng)二,選擇此選項(xiàng)可顯示所創(chuàng)建的二叉樹。</
115、p><p> 選項(xiàng)三,選此選項(xiàng)可對(duì)所創(chuàng)建的二叉樹采用遞歸算法進(jìn)行前序遍歷。</p><p> 選項(xiàng)四,選此選項(xiàng)可對(duì)所創(chuàng)建的二叉樹采用遞歸算法進(jìn)行中序遍歷。</p><p> 選項(xiàng)五,選此選項(xiàng)可對(duì)所創(chuàng)建的二叉樹采用遞歸算法進(jìn)行后序遍歷。</p><p> 選項(xiàng)六,選此選項(xiàng)可對(duì)所創(chuàng)建的二叉樹采用非遞歸算法進(jìn)行前序遍歷。</p>
116、<p> 選項(xiàng)七,選此選項(xiàng)可對(duì)所創(chuàng)建的二叉樹采用非遞歸算法進(jìn)行中序遍歷。</p><p> 選項(xiàng)八,選此選項(xiàng)可對(duì)所創(chuàng)建的二叉樹采用非遞歸算法進(jìn)行后序遍歷。</p><p> 選項(xiàng)九,選此選項(xiàng)可對(duì)所創(chuàng)建的二叉樹采用非遞歸算法進(jìn)行層序遍歷。</p><p> 選項(xiàng)十,選此選項(xiàng)可以根據(jù)提示進(jìn)行樹的創(chuàng)建。并可以按樹狀輸出樹,還可以把樹轉(zhuǎn)換成二叉樹并按樹狀輸
117、出。</p><p> 選項(xiàng)十一,選此選項(xiàng),退出程序。</p><p><b> 八.總結(jié)</b></p><p> 雖然都說(shuō)“程序=數(shù)據(jù)結(jié)構(gòu)+算法”,但我在學(xué)習(xí)運(yùn)用數(shù)據(jù)結(jié)構(gòu)編程之前,并沒(méi)能深刻體會(huì)到這一點(diǎn),直到這次課設(shè)實(shí)踐。我感受最深的一點(diǎn)是:以前用C編程,只是注重如何編寫函數(shù)能夠完成所需要的功能,似乎沒(méi)有明確的戰(zhàn)術(shù),只是憑單純的意識(shí)和
118、簡(jiǎn)單的語(yǔ)句來(lái)堆砌出一段程序。感覺(jué)有點(diǎn)像張飛打仗,有勇無(wú)謀,只要能完成任務(wù)就行。</p><p> 但現(xiàn)在編程感覺(jué)完全不同了。在編寫一個(gè)程序之前,自己能夠綜合考慮各種因素,首先選取自己需要的數(shù)據(jù)結(jié)構(gòu),是樹還是圖或是別的什么?然后選定一種或幾種存儲(chǔ)結(jié)構(gòu)來(lái)具體的決定后面的函數(shù)的主要風(fēng)格。最后在編寫每一個(gè)函數(shù)之前,可以仔細(xì)斟酌比對(duì),挑選出最適合當(dāng)前狀況的算法。這樣,即使在完整的程序還沒(méi)有寫出來(lái)之前,自己心中已經(jīng)有了明確
119、的原圖了。這樣無(wú)形中就提高了自己編寫的程序的質(zhì)量。</p><p> 另外,我還體會(huì)到深刻理解數(shù)據(jù)結(jié)構(gòu)的重要性。只有真正理解這樣定義數(shù)據(jù)類型的好處,才能用好這樣一種數(shù)據(jù)結(jié)構(gòu)。了解典型數(shù)據(jù)結(jié)構(gòu)的性質(zhì)是非常有用的,它往往是編寫程序的關(guān)鍵。</p><p> 經(jīng)過(guò)幾周的的奮斗,這次數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計(jì)終于做完了。通過(guò)這次課程設(shè)計(jì),我發(fā)現(xiàn)了以往學(xué)習(xí)中的很多不足,弄懂了很多疑難問(wèn)題并學(xué)到了很多知識(shí)
120、。在此我要感謝同學(xué)們及幾位老師在此次課程設(shè)計(jì)中對(duì)我的指導(dǎo)和幫助。</p><p><b> 九.參考文獻(xiàn)</b></p><p> 1. 本年級(jí)使用的教材:數(shù)據(jù)結(jié)構(gòu)與算法分析(C++版)(第二版)影印版 2005.7</p><p> 2. 數(shù)據(jù)結(jié)構(gòu)與算法,科學(xué)出版社,2005.08;趙文靜 祁飛等編著</p><p&
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---走迷宮游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---走迷宮游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---走迷宮游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-走迷宮
- 迷宮游戲數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--flash 迷宮小游戲
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---迷宮求解
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)迷宮求解課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)迷宮課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---迷宮
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告----迷宮問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---迷宮算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-迷宮求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)迷宮問(wèn)題課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---迷宮問(wèn)題
- 迷宮問(wèn)題——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)迷宮問(wèn)題
- 迷宮求解數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論