2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩14頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告</p><p>  題 目 </p><p>  學(xué)生姓名 </p><p>  學(xué) 號 </p><p>  專業(yè)班級

2、 </p><p>  指導(dǎo)老師 </p><p>  設(shè)計(jì)日期 </p><p><b>  指導(dǎo)老師評閱意見:</b></p><p><b>  目錄</b&g

3、t;</p><p>  問題定義································

4、;······3</p><p>  可行性分析·························

5、3;·········3-4</p><p>  調(diào)試界面······················&#

6、183;··············4-7</p><p>  錯(cuò)誤分析·················

7、·····················7</p><p>  總結(jié)···········&#

8、183;·····························7-8</p><p>  附錄··&#

9、183;····································

10、·8-14</p><p><b>  問題定義</b></p><p><b>  1.1 課題:</b></p><p>  建立二叉樹,層序、先序、中序、后序遍歷( 用遞歸或非遞歸的方法)以及中序線索化。</p><p><b>  1.2意義:</b><

11、/p><p>  通過以前的學(xué)習(xí)以及查看相關(guān)資料,按照題目要求編寫程序,進(jìn)一步加強(qiáng)對編程的訓(xùn)練,使得自己掌握一些將書本知識轉(zhuǎn)化為實(shí)際應(yīng)用當(dāng)中去,在整個(gè)程序中,主要應(yīng)用的是鏈表,但也運(yùn)用了棧。通過兩種方法解決現(xiàn)有問題。</p><p><b>  1.3要求:</b></p><p>  要求能夠輸入樹的各個(gè)結(jié)點(diǎn),并能夠輸出用不同方法遍歷的遍歷序列;

12、分別建立建立二叉樹存儲結(jié)構(gòu)的的輸入函數(shù)、輸出層序遍歷序列的函數(shù)、輸出先序遍歷序列的函數(shù)、輸出中序遍歷序列的函數(shù)、輸出后序遍歷序列的函數(shù); 實(shí)現(xiàn)二叉樹的中序線索化。</p><p><b>  可行性分析</b></p><p>  2.1 創(chuàng)建二叉樹鏈表的結(jié)點(diǎn)存儲結(jié)構(gòu)及數(shù)據(jù)的輸入函數(shù)</p><p>  因?yàn)槊總€(gè)結(jié)點(diǎn)所存儲的數(shù)據(jù)類型為字符串,卻

13、無法使用字符串和String等數(shù)據(jù)類型,所以使用單鏈表作為結(jié)點(diǎn)所存儲的數(shù)據(jù)類型。以#表示空結(jié)點(diǎn)。</p><p>  利用先序遍歷創(chuàng)建鏈表 </p><p>  2.1.1用單鏈表s記錄輸入的數(shù)據(jù) </p><p>  2.1.2利用非遞歸調(diào)用分別生成根節(jié)點(diǎn)的左子樹和右子樹。</p><p>  2.1.3返回菜單重新選擇。</p>

14、;<p><b>  基本程序如下:</b></p><p>  void CreatBiTree_q(BiTree &T)/</p><p><b>  { </b></p><p><b>  ······</b>&

15、lt;/p><p>  if(ch=='#')</p><p><b>  T=NULL;</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  T=(BiTree)malloc(s

16、izeof(BiTNode));</p><p><b>  if(!T)</b></p><p><b>  exit(0);</b></p><p>  T->data=ch;</p><p>  T->LTag=Link;</p><p>  T->R

17、Tag=Link;</p><p>  CreatBiTree_q(T->lchild);</p><p>  CreatBiTree_q(T->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  

18、2.2先序遍歷、中序遍歷、后序遍歷二叉鏈表。</p><p>  A 、先序遍歷:訪問根節(jié)點(diǎn),左子樹,右子樹的順序。</p><p>  B、中序遍歷:訪問左子樹,根節(jié)點(diǎn),右子樹的順序。</p><p>  C、后序遍歷:訪問左子樹,右子樹,根節(jié)點(diǎn)的順序。</p><p>  D、層次遍歷:從根結(jié)點(diǎn)開始,按從左至右的順序依次訪問。</p

19、><p>  E、中序線索化:將二叉樹線索化,再進(jìn)行中序遍歷輸出。</p><p><b>  2.3主函數(shù)</b></p><p>  a、調(diào)用生成二叉樹的函數(shù),從鍵盤輸入二叉樹的各個(gè)結(jié)點(diǎn)</p><p>  b、分別調(diào)用先序遍歷、中序遍歷、后序遍歷二叉樹的函數(shù),輸出所有結(jié)點(diǎn)</p><p><

20、;b>  顯示的菜單為:</b></p><p>  ***********************************************</p><p><b>  請選擇遍歷算法</b></p><p>  1.按先序輸入二叉樹序列以#表示空節(jié)點(diǎn)</p><p>  2.先序遍歷二叉樹遞非

21、歸算法 </p><p>  3.中序遍歷二叉樹非遞歸算法</p><p>  4.后序遍歷二叉樹非遞歸算法</p><p>  5.層次遍歷二叉樹非遞歸算法</p><p>  6.中序線索遍歷二叉樹算法</p><p>  0.按0退出"<<endl</p><p> 

22、 請輸入序號(0,1,2,3,4,5,6):</p><p><b>  三、調(diào)試界面:</b></p><p>  3.1調(diào)試所用二叉樹:</p><p>  A </p><p&g

23、t;  B </p><p>  C D </p><p>  E F

24、 </p><p>  G </p><p>  輸入的二叉樹是:ABC##DE#F##G###(#代表空結(jié)點(diǎn))</p><p

25、>  輸出的遍歷應(yīng)該是:先序遍歷:A B C D E F G</p><p>  中序遍歷:C B E F D G A</p><p>  后序遍歷:C B G E F D A</p><p>  層序遍歷:A B C D E F G </p><p>  中序線索化遍歷:C B E F D G A</p><p&g

26、t;  3.2程序運(yùn)行如下:</p><p><b>  1、菜單界面:</b></p><p><b>  2、創(chuàng)建界面:</b></p><p>  3、先序非遍歷二叉樹:</p><p>  4、中序非遍歷二叉樹:</p><p>  5、后序非遍歷二叉樹:</p

27、><p>  6、層次遍歷二叉樹:</p><p>  7、中序線索化,中序遍歷:</p><p><b>  四、錯(cuò)誤分析:</b></p><p>  1、中序線索化后,先序、中序、后序、層次遍歷均出現(xiàn)錯(cuò)誤,陷入死循環(huán),</p><p>  改正:另外編寫一個(gè)創(chuàng)建二叉樹的函數(shù),中序線索化另外重新創(chuàng)

28、建,中序輸出函數(shù)也另外編寫</p><p>  2、中序線索化時(shí),用到的線索在結(jié)構(gòu)體內(nèi)定義,在線索化時(shí),顯示為未定義</p><p>  改正:直接在外部定義線索#define Link 0 和#define Thread 1</p><p><b>  五、總結(jié)</b></p><p>  實(shí)驗(yàn)開始時(shí)定義結(jié)構(gòu)時(shí),比細(xì)心

29、,總會(huì)有或多或少的問題出現(xiàn),如數(shù)據(jù)域和指針域定義的類型不一樣,在實(shí)驗(yàn)過程中總有這樣或那樣的問題,在本次實(shí)驗(yàn)中,二叉樹的先序,中序,后序遍歷都是采用非遞歸調(diào)用,用起來稍微復(fù)雜,這使我更進(jìn)一步學(xué)習(xí)和理解了樹的遍歷,更靈活地運(yùn)用了指針與數(shù)組。</p><p><b>  附錄</b></p><p><b>  6.1源程序</b></p>

30、<p>  #include <iostream.h></p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #include <malloc.h> </p><p>  #define Link

31、0</p><p>  #define Thread 1</p><p>  int right=0;</p><p>  typedef char TElemType;</p><p>  typedef struct BiTNode</p><p><b>  {</b></p>

32、<p>  TElemType data;</p><p>  struct BiTNode *lchild,*rchild; </p><p>  int LTag, RTag,flag;</p><p>  }BiTNode,*BiTree;</p><p>  BiTree pre;</p><p>

33、  void CreatBiTree_q(BiTree &T)</p><p><b>  {</b></p><p>  TElemType ch;</p><p>  scanf("%c",&ch);</p><p>  if(ch=='#')</p>

34、<p><b>  T=NULL;</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  T=(BiTree)malloc(sizeof(BiTNode));</p><p><b>  if(!

35、T)</b></p><p><b>  exit(0);</b></p><p>  T->data=ch;</p><p>  T->LTag=Link;</p><p>  T->RTag=Link;</p><p>  CreatBiTree_q(T->

36、lchild);</p><p>  CreatBiTree_q(T->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void CreateBiTree(BiTree *T)</p><p><

37、;b>  { </b></p><p>  TElemType ch;</p><p>  scanf("%c",&ch);</p><p>  if(ch=='#')</p><p><b>  *T=NULL;</b></p><p&g

38、t;<b>  else</b></p><p><b>  {</b></p><p>  *T=(BiTree)malloc(sizeof(BiTNode));</p><p>  if(!*T) exit(-1);</p><p>  (*T)->data=ch;</p>

39、<p>  CreateBiTree(&(*T)->lchild);</p><p>  CreateBiTree(&(*T)->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void P

40、reOrderTraverse(BiTree &T)</p><p><b>  {</b></p><p>  BiTree p,S[20];</p><p>  int top=-1;</p><p>  p=T; </p><p><b>  do<

41、;/b></p><p><b>  {</b></p><p>  while(p!= NULL) </p><p><b>  {</b></p><p>  cout << p->data<<" ";</p><p&g

42、t;<b>  top++;</b></p><p>  S[top]=p; </p><p>  p=p->lchild;</p><p><b>  }</b></p><p>  if( top >-1 )</p><p><b>  {</

43、b></p><p>  p=S[top]; </p><p><b>  top--; </b></p><p>  p = p->rchild; </p><p><b>  }</b></p><p>  }while (( p != NULL ) ||(t

44、op>-1));</p><p><b>  }</b></p><p>  int inorderTraverse(BiTree &T)</p><p><b>  {</b></p><p>  BiTree p,s[20];int i=-1;</p><p&g

45、t;<b>  p=T;</b></p><p>  while(p||i>-1)</p><p><b>  {</b></p><p><b>  if(p)</b></p><p><b>  {</b></p><p>

46、;<b>  i++;</b></p><p><b>  s[i]=p;</b></p><p>  p=p->lchild;</p><p><b>  }</b></p><p><b>  else</b></p><p

47、><b>  {</b></p><p><b>  p=s[i];</b></p><p>  cout<<" ";</p><p>  cout<<p->data;</p><p><b>  i--;</b><

48、/p><p>  p=p->rchild;</p><p><b>  }</b></p><p>  }return 0;</p><p><b>  }</b></p><p>  void postorder (BiTree T){</p><p&

49、gt;  int s2[20],top=0;</p><p>  BiTree p,s1[20];</p><p><b>  p=T;</b></p><p><b>  do {</b></p><p>  while (p!=NULL)</p><p><b>

50、;  {</b></p><p>  s1[top]=p; s2[top++]=0; </p><p>  p=p->lchild;</p><p><b>  } </b></p><p>  while(top && s2[top-1]==1)</p><

51、p><b>  {</b></p><p><b>  top--;</b></p><p>  p=s1[top]; </p><p>  cout<<" ";</p><p>  cout<<p->data; </p><

52、;p><b>  } </b></p><p>  if(top>0) </p><p><b>  { </b></p><p>  s2[top-1]=1;</p><p>  p=s1[top-1]->rchild; </p><p><b&g

53、t;  }</b></p><p>  }while (top>0); </p><p><b>  }</b></p><p>  void LevelOrder(BiTree &b)</p><p><b>  {</b></p><p>  B

54、iTree qu[20];</p><p>  int front,rear;</p><p>  front=rear=-1;</p><p><b>  rear++;</b></p><p>  qu[rear]=b;</p><p>  while(front!=rear)</p&g

55、t;<p><b>  {</b></p><p>  front=(front+1)%20;</p><p>  b=qu[front];</p><p>  printf(" %c ",b->data);</p><p>  if(b->lchild!=NULL)<

56、/p><p><b>  {</b></p><p>  rear=(rear+1)%20;</p><p>  qu[rear]=b->lchild;</p><p><b>  } </b></p><p>  if(b->rchild!=NULL)</

57、p><p><b>  {</b></p><p>  rear=(rear+1)%20;</p><p>  qu[rear]=b->rchild;</p><p><b>  } </b></p><p><b>  } </b>&l

58、t;/p><p><b>  }</b></p><p>  void InThreading(BiTree p)</p><p><b>  {</b></p><p><b>  if(p)</b></p><p><b>  {</b&

59、gt;</p><p>  InThreading(p->lchild);</p><p>  if(!p->lchild)//前驅(qū)線索</p><p><b>  {</b></p><p>  p->LTag=Thread;</p><p>  p->lchild=pr

60、e;</p><p><b>  }</b></p><p>  if(!pre->rchild)//后繼線索</p><p><b>  {</b></p><p>  pre->RTag=Thread;</p><p>  pre->rchild=p;&

61、lt;/p><p><b>  }</b></p><p><b>  pre=p;</b></p><p>  InThreading(p->rchild);</p><p><b>  }</b></p><p><b>  }</

62、b></p><p>  void InOrderThreading(BiTree *Thrt,BiTree T)</p><p><b>  {</b></p><p>  if(!((*Thrt)=(BiTree)malloc(sizeof(BiTNode))))</p><p><b>  exit

63、(0);</b></p><p>  (*Thrt)->LTag=Link;</p><p>  (*Thrt)->RTag=Thread;</p><p>  (*Thrt)->rchild=(*Thrt);</p><p><b>  if(!T)</b></p><

64、p>  (*Thrt)->lchild=(*Thrt);</p><p><b>  else</b></p><p><b>  {</b></p><p>  (*Thrt)->lchild=T;</p><p>  pre=(*Thrt);</p><p&

65、gt;  InThreading(T);</p><p>  pre->rchild=(*Thrt);</p><p>  pre->RTag=Thread;</p><p>  (*Thrt)->rchild=pre;</p><p><b>  }</b></p><p>&

66、lt;b>  }</b></p><p>  void InorderTraverse_Thr(BiTree &T)</p><p><b>  {</b></p><p><b>  BiTree p;</b></p><p>  p=T->lchild;</

67、p><p>  while(p!=T)p=T</p><p><b>  {</b></p><p>  while(p->LTag==Link)</p><p>  p=p->lchild;</p><p>  cout<<p->data;</p><

68、;p>  while(p->RTag==Thread&&p->rchild!=T)</p><p><b>  {</b></p><p>  p=p->rchild;</p><p>  cout<<" ";</p><p>  cout<&

69、lt;p->data;</p><p><b>  }</b></p><p>  p=p->rchild;</p><p><b>  }</b></p><p><b>  }</b></p><p>  int main()</p

70、><p><b>  {</b></p><p>  BiTree T,t;</p><p><b>  int e;</b></p><p>  while(e!=0)</p><p><b>  {</b></p><p>  

71、cout<<endl<<"請選擇遍歷算法:"<<endl;</p><p>  cout<<"1.按先序輸入二叉樹序列以#表示空節(jié)點(diǎn) "<<endl;</p><p>  cout<<"2.先序遍歷二叉樹遞歸算法:"<<endl; </p&g

72、t;<p>  cout<< "3.中序遍歷二叉樹遞歸算法:"<<endl;</p><p>  cout<<"4.后序遍歷二叉樹遞歸算法: "<<endl;</p><p>  cout<<"5.層次遍歷二叉樹遞歸算法"<<endl;</

73、p><p>  cout<<"6.中序線索遍歷二叉樹算法"<<endl;</p><p>  cout<<"0.按0退出"<<endl;</p><p>  cout<<"請輸入序號(0,1,2,3,4,5,6):"<<endl;</

74、p><p><b>  cin>>e;</b></p><p>  cout<<endl;</p><p><b>  if(e==1)</b></p><p><b>  { </b></p><p>  cout <&l

75、t;"按先序輸入二叉樹序列以#表示空節(jié)點(diǎn): "<<endl;</p><p>  CreateBiTree(&T);</p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  if(e==2)</b&

76、gt;</p><p><b>  {</b></p><p>  cout << "先序遍歷遞歸算法是: "<<endl;;</p><p>  PreOrderTraverse(T);</p><p>  cout<<endl;</p><

77、p><b>  }</b></p><p>  if(e==3) </p><p><b>  { </b></p><p>  cout<< "中序遍歷遞歸算法是: "<<endl;;</p><p>  inorderTraverse

78、(T);</p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  if(e==4)</b></p><p><b>  {</b></p><p>  cout<<"

79、;后序遍歷的非遞歸算法是: "<<endl;</p><p>  postorder (T);</p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  if(e==5)</b></p><

80、;p><b>  { </b></p><p>  printf("\n層次遍歷二叉樹:\n");</p><p>  LevelOrder(T);</p><p><b>  }</b></p><p><b>  if(e==6)</b></

81、p><p><b>  {</b></p><p>  cout <<"按先序輸入二叉樹序列以#表示空節(jié)點(diǎn): "<<endl;</p><p>  CreatBiTree_q(T);</p><p>  cout<<endl;</p><p> 

82、 printf("中序線索化二叉樹:\n");</p><p>  InOrderThreading(&t,T);</p><p>  printf("線索化工作已經(jīng)完成!中序遍歷二叉樹\n");</p><p>  InorderTraverse_Thr(t);</p><p>  print

83、f("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>&

84、lt;b>  6.2 參考資料</b></p><p>  【1】嚴(yán)蔚敏、吳偉民主編 《數(shù)據(jù)結(jié)構(gòu)》(C語言版) 清華大學(xué)出版社 2002【2】殷人昆等著 《數(shù)據(jù)結(jié)構(gòu)》(C++版) 清華大學(xué)出版社 2001【3】 金遠(yuǎn)平著 《數(shù)據(jù)結(jié)構(gòu)》(C++描述) 清華大學(xué)出版社 2005【4】許卓群等著 《數(shù)據(jù)結(jié)構(gòu)與

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論