數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告——可視化走迷宮游戲_第1頁
已閱讀1頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設(shè)計(jì)(論文)</b></p><p>  題 目: 可視化走迷宮游戲 </p><p>  院 (系): </p><p>  專業(yè)班級: </p><p>  姓 名:

2、 </p><p>  學(xué) 號: </p><p>  指導(dǎo)教師: </p><p>  2011年9月15日</p><p>  課程設(shè)計(jì)(論文)任務(wù)書</p><p>  專業(yè)班級: 計(jì)算機(jī)901 學(xué)生姓名: 指導(dǎo)教師(簽名

3、): </p><p><b>  摘要</b></p><p>  本設(shè)計(jì)是為了實(shí)現(xiàn)一個可視化迷宮,以及利用最短路徑算法尋找迷宮的出路以及將最短路徑打印在屏幕上,并且限制小老鼠不能穿越墻,只能在路徑上移動。而且可以根據(jù)自己的需要設(shè)計(jì)迷宮地圖。</p><p><b>  關(guān)鍵詞:mfc </b><

4、;/p><p><b>  目 錄</b></p><p>  一.設(shè)計(jì)目的........................................................................................1</p><p>  二.問題描述............................

5、...........................................................1</p><p>  三.需求分析.......................................................................................1</p><p>  四.概要設(shè)計(jì)..............

6、..........................................................................2</p><p>  五.詳細(xì)設(shè)計(jì).......................................................................................4</p><p>  六.測試分

7、析……………………………………………………....27</p><p>  七.使用說明……………………………………...........................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>  通過課程設(shè)計(jì),鞏固所學(xué)的理論知識,培養(yǎng)綜合運(yùn)用所學(xué)知識解決實(shí)際問題的能力。能根據(jù)實(shí)際問題的具體情況,結(jié)合數(shù)據(jù)結(jié)構(gòu)課程中的基本理論和基本算法,正確分析出數(shù)據(jù)的邏輯結(jié)構(gòu),合理地選擇相應(yīng)的存儲結(jié)構(gòu),并能設(shè)計(jì)出解決問題的有效算法。</p><p><b>  二.問題描述</b></p><p><b>  1.地圖要求:</b&

10、gt;</p><p>  根據(jù)要求構(gòu)造一個迷宮地圖,并且是老鼠清晰可見,可用鍵盤操縱老鼠上下左右移動;有一個窗口顯示部分地圖,另一個窗口顯示全部題圖。</p><p><b>  2.操作:</b></p><p>  老鼠不能穿墻而過,當(dāng)老鼠到達(dá)糧倉提示成功??梢宰詣诱业矫詫m的所有路徑以及畫出最短路徑。</p><p&g

11、t;<b>  三.需求分析</b></p><p>  1.利用mfc可以把迷宮地圖以及老鼠形象可變的畫出來。</p><p>  2.需要有墻有路,通過把迷宮地圖劃分成一個一個小方塊,通過一個數(shù)組的值來判斷是墻是路。(1表示墻0表示路)</p><p>  3.通過鼠標(biāo)事件控制老鼠的移動。</p><p>  4.把

12、每個數(shù)組元素對應(yīng)一個按鈕根據(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),以及分割成大小兩個窗口。</p><p>  4.2、用戶的登陸界面</p><p>  利用對話框設(shè)計(jì)用戶登陸界面,界面包括用戶名,選擇的迷宮級別。</p><p><b>  4.3、地圖的繪制</b></p><p>  根據(jù)登陸界面的上面的信息,繪制迷宮地圖。選擇加載全圖菜單會顯示迷宮總圖。

14、</p><p>  4.4、游戲音樂的設(shè)置</p><p>  在迷宮加載之后,播放背景音樂,利用多線程異步播放。</p><p>  4.5、小老鼠鍵盤操作</p><p>  利用鍵盤事件,完成小老鼠的操作。</p><p>  4.6、全圖與部分的同步</p><p>  利用CFram

15、eWnd類實(shí)現(xiàn)兩個view類的同步操作。</p><p>  4.7、搜索迷宮路徑及最短路徑的顯示</p><p>  選擇‘路徑‘菜單利用遞歸搜索出迷宮所有路徑并且把最短路徑繪制在全圖顯示中。</p><p>  4.8、編輯迷宮地圖</p><p>  利用對話框中每一個按鈕對用迷宮的一部分,編輯迷宮地圖。</p><

16、p>  4.9、層次序遍歷算法</p><p>  按照樹的層次從左到右訪問樹的結(jié)點(diǎn),層序遍歷用于保存結(jié)點(diǎn)的容器是隊(duì)列。void LevelOrder(BiNode root)。</p><p>  4.10、樹與二叉樹的轉(zhuǎn)換算法</p><p>  轉(zhuǎn)換時結(jié)點(diǎn)的第一個孩子變?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ù)級別將自動加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>  我真誠地保證:</b></p><

20、;p>  我自己獨(dú)立地完成了整個程序從分析、設(shè)計(jì)到編碼的全過程。</p><p>  如果在上述過程中,我遇到了困難而求教于人,那么,我將在程序報(bào)告中詳細(xì)地列舉我所遇到的問題,以及別人給我的提示。</p><p>  我的程序里中凡是引用到其他程序或文檔之處,例如教材、課堂筆記、網(wǎng)上的源代碼以及其他參考書上的代碼段,我都已經(jīng)在程序的注釋里很清楚地注明了引用的出處。</p>

21、<p>  我從未抄襲過別人的程序,也沒有盜用別人的程序,無論是修改式地抄襲還是原封不動地抄襲。</p><p>  我編寫這個程序,從來沒有想過要去破壞或妨礙其他計(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);//動態(tài)申請節(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++)//控制每層輸出的個數(shù)</p><p><b>  {</b></p><p>  if(h[k]->data=='0') cout<<"["<<&q

35、uot;]";//當(dāng)為空時輸出[]</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];//申請一個BiNode數(shù)組</p><p>  int top=0;//采用順序棧,并假定不會發(fā)生上溢</p><p><b>  do{</b></p><p>  while(root!=NULL)//當(dāng)結(jié)點(diǎn)不為空時</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)為空但棧頂不為零時</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]; //申請一個BiNode數(shù)組&

52、lt;/p><p>  int top=0; //采用順序棧,并假定不會發(fā)生上溢</p><p><b>  do{</b></p><p>  while(root!=NULL) //當(dāng)結(jié)點(diǎn)不為空時</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)為空但棧頂不為零時</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>  //申請一個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)不為空時</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)記位為一時輸出</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)為空但棧頂不為零時</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]; //申請一個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)不空時</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í)例化一個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<<"請輸入你的二叉樹(請按層次由上往下從左到右依次

72、輸入并按#結(jié)束,如果節(jié)點(diǎn)為空請輸入'0',本遍歷器僅支持單字符),輸入為:\n";</p><p>  int i=0,j=0; </p><p>  char b[maxIsize]={'#'},n ;</p><p>  //當(dāng)輸入不為'#'時給數(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;請選擇你要進(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>  六.測試分析</b></p><p>  二叉樹遍歷中用到的最重要的一個思想就是遞歸調(diào)用,這次作業(yè)是我對遞歸有了更深入的理解,尤其是對退回上一層后應(yīng)執(zhí)行的語句和結(jié)點(diǎn)位置的思路更加清晰。程序調(diào)試比較順利。</p><p>  用棧同樣可以實(shí)現(xiàn)二叉樹的遍歷,這使我認(rèn)識到

109、解決一個問題可以有多種不同的途徑,應(yīng)隨時將以前學(xué)過的知識靈活應(yīng)用起來,解決新的問題。在使用棧結(jié)構(gòu)時,為了方便,我采用了二叉樹結(jié)構(gòu),將其與鏈?zhǔn)綏=Y(jié)合起來。 </p><p>  因?yàn)楸闅v二叉樹的基本操作是訪問結(jié)點(diǎn),所以無論哪一種遍歷方式,對含有n個結(jié)點(diǎn)的二叉樹,其時間復(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、測試目的</b></p><p>  測試該程序是否完成所有功能,以及程序存在的不足。</p><p><b>  6.2、測試數(shù)據(jù)</b></p><p>

111、<b>  1234567</b></p><p><b>  6.3、測試結(jié)果</b></p><p>  圖10、開始過度界面</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>  七.使用說明</b></p><p>  運(yùn)行程序,首先出現(xiàn)主界面。主界面有十一個選項(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)可對所創(chuàng)建的二叉樹采用遞歸算法進(jìn)行前序遍歷。</p><p>  選項(xiàng)四,選此選項(xiàng)可對所創(chuàng)建的二叉樹采用遞歸算法進(jìn)行中序遍歷。</p><p>  選項(xiàng)五,選此選項(xiàng)可對所創(chuàng)建的二叉樹采用遞歸算法進(jìn)行后序遍歷。</p><p>  選項(xiàng)六,選此選項(xiàng)可對所創(chuàng)建的二叉樹采用非遞歸算法進(jìn)行前序遍歷。</p>

116、<p>  選項(xiàng)七,選此選項(xiàng)可對所創(chuàng)建的二叉樹采用非遞歸算法進(jìn)行中序遍歷。</p><p>  選項(xiàng)八,選此選項(xiàng)可對所創(chuàng)建的二叉樹采用非遞歸算法進(jìn)行后序遍歷。</p><p>  選項(xiàng)九,選此選項(xiàng)可對所創(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>  雖然都說“程序=數(shù)據(jù)結(jié)構(gòu)+算法”,但我在學(xué)習(xí)運(yùn)用數(shù)據(jù)結(jié)構(gòu)編程之前,并沒能深刻體會到這一點(diǎn),直到這次課設(shè)實(shí)踐。我感受最深的一點(diǎn)是:以前用C編程,只是注重如何編寫函數(shù)能夠完成所需要的功能,似乎沒有明確的戰(zhàn)術(shù),只是憑單純的意識和

118、簡單的語句來堆砌出一段程序。感覺有點(diǎn)像張飛打仗,有勇無謀,只要能完成任務(wù)就行。</p><p>  但現(xiàn)在編程感覺完全不同了。在編寫一個程序之前,自己能夠綜合考慮各種因素,首先選取自己需要的數(shù)據(jù)結(jié)構(gòu),是樹還是圖或是別的什么?然后選定一種或幾種存儲結(jié)構(gòu)來具體的決定后面的函數(shù)的主要風(fēng)格。最后在編寫每一個函數(shù)之前,可以仔細(xì)斟酌比對,挑選出最適合當(dāng)前狀況的算法。這樣,即使在完整的程序還沒有寫出來之前,自己心中已經(jīng)有了明確

119、的原圖了。這樣無形中就提高了自己編寫的程序的質(zhì)量。</p><p>  另外,我還體會到深刻理解數(shù)據(jù)結(jié)構(gòu)的重要性。只有真正理解這樣定義數(shù)據(jù)類型的好處,才能用好這樣一種數(shù)據(jù)結(jié)構(gòu)。了解典型數(shù)據(jù)結(jié)構(gòu)的性質(zhì)是非常有用的,它往往是編寫程序的關(guān)鍵。</p><p>  經(jīng)過幾周的的奮斗,這次數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計(jì)終于做完了。通過這次課程設(shè)計(jì),我發(fā)現(xiàn)了以往學(xué)習(xí)中的很多不足,弄懂了很多疑難問題并學(xué)到了很多知識

120、。在此我要感謝同學(xué)們及幾位老師在此次課程設(shè)計(jì)中對我的指導(dǎo)和幫助。</p><p><b>  九.參考文獻(xiàn)</b></p><p>  1. 本年級使用的教材:數(shù)據(jù)結(jié)構(gòu)與算法分析(C++版)(第二版)影印版 2005.7</p><p>  2. 數(shù)據(jù)結(jié)構(gòu)與算法,科學(xué)出版社,2005.08;趙文靜 祁飛等編著</p><p&

溫馨提示

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

最新文檔

評論

0/150

提交評論