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

下載本文檔

版權(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>  課程名稱 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p>  題目名稱 二叉排序樹的實(shí)現(xiàn) </p><p>  學(xué) 院 應(yīng)用數(shù)學(xué)學(xué)院 </p><p>  專業(yè)班級(jí) </p><p> 

2、 學(xué) 號(hào) </p><p>  學(xué)生姓名 </p><p>  指導(dǎo)教師 </p><p>  2013 年 12 月 26 日</p><p><b>  1.設(shè)計(jì)任務(wù)</b></p><p>  實(shí)現(xiàn)二叉排序樹,包

3、括生成、插入,刪除;</p><p>  對(duì)二叉排序樹進(jìn)行先根、中根、和后根非遞歸遍歷;</p><p>  每次對(duì)樹的修改操作和遍歷操作的顯示結(jié)果都需要在屏幕上</p><p>  用樹的形狀表示出來(lái)。</p><p>  分別用二叉排序樹和數(shù)組去存儲(chǔ)一個(gè)班(50人以上)的成員信 </p><

4、;p>  息(至少包括學(xué)號(hào)、姓名、成績(jī)3項(xiàng)),對(duì)比查找效率,并說(shuō)明 </p><p>  為什么二叉排序樹效率高(或者低)。</p><p><b>  2. 函數(shù)模塊:</b></p><p>  2.1.主函數(shù)main模塊功能</p><p>  1.通過(guò)bstree CreatTree()操作建立二叉排

5、序樹。 </p><p>  2.在二叉排序樹t中通過(guò)操作bstree InsertBST(bstree t,int </p><p>  key,nametype name,double grade)插入一個(gè)節(jié)點(diǎn)。</p><p>  3. 從二叉排序樹t中通過(guò)操作void Delete(bstree &p)刪除任意節(jié)點(diǎn)。</p><

6、;p>  4. 在二叉排序樹t中通過(guò)操作bstnode *SearchBST(bstree t,keytype key)查找節(jié)點(diǎn)。</p><p>  5. 在二叉排序樹t中通過(guò)操作p=SearchBST(t,key)查詢,并修改節(jié)點(diǎn)信息</p><p>  6. 非遞歸遍歷二叉排序樹。</p><p>  7. 定義函數(shù)void compare()對(duì)數(shù)組和二

7、叉排序樹的查找效率進(jìn)行比較比較。</p><p>  2.2創(chuàng)建二叉排序樹CreatTree模塊</p><p>  從鍵盤中輸入關(guān)鍵字及記錄,并同時(shí)調(diào)用插入函數(shù)并不斷進(jìn)行插入。最后,返回根節(jié)點(diǎn)T。</p><p><b>  2.3刪除模塊:</b></p><p>  二叉排序樹上刪除一個(gè)階段相當(dāng)于刪去有序系列中的一

8、個(gè)記錄,只要在刪除某個(gè)節(jié)點(diǎn)之后依舊保持二叉排序樹的性質(zhì)即可。假設(shè)二叉排序樹上刪除節(jié)點(diǎn)為*p(指向節(jié)點(diǎn)的指針為p),其雙親節(jié)點(diǎn)為*f(節(jié)點(diǎn)指針為f)。若*p節(jié)點(diǎn)為葉子節(jié)點(diǎn),則即左右均為空樹,由于刪去葉子節(jié)點(diǎn)不破壞整棵樹的結(jié)構(gòu),則只需修改其雙親節(jié)點(diǎn)的指針即可;若*p節(jié)點(diǎn)只有左子樹或只有右子樹,此時(shí)只要令左子樹或右子樹直接成為其雙親節(jié)點(diǎn)*f的左子樹即可;若*p節(jié)點(diǎn)的左子樹和右子樹均不為空,其一可以令*p的左子樹為*f的左子樹,而*p的右子樹為

9、*s的右子樹,其二可以令*p的直接前驅(qū)(或直接后繼)替代*p,然后再?gòu)亩媾判驑渲袆h去它的直接前驅(qū)(或直接后繼)。在二叉排序樹中刪除一個(gè)節(jié)點(diǎn)的算法為</p><p>  void DeleteData(bstree &t,keytype key)</p><p>  若二叉排序樹t中存在關(guān)鍵字等于key的數(shù)據(jù)元素,則刪除該數(shù)據(jù)元素節(jié)點(diǎn),并返回TRUE,否則返回FALSE。</

10、p><p><b>  2.4插入模塊</b></p><p>  二叉排序樹是一種動(dòng)態(tài)樹表,其特點(diǎn)是樹的結(jié)構(gòu)通常不是一次生成的,而是在查找的過(guò)程中,當(dāng)樹中不存在關(guān)鍵字等于給定值得節(jié)點(diǎn)時(shí)在進(jìn)行插入。新插入的節(jié)點(diǎn)一定是一個(gè)新添加的葉子節(jié)點(diǎn),并且是查找不成功時(shí)查找路徑上訪問(wèn)的最后一個(gè)節(jié)點(diǎn)的左孩子或右孩子的節(jié)點(diǎn)。一個(gè)無(wú)序系列可以通過(guò)構(gòu)造一棵二叉排序樹而變成一個(gè)有序系列,構(gòu)造樹的

11、過(guò)程即為對(duì)無(wú)序系列進(jìn)行排序的過(guò)程, 并且每次插入的節(jié)點(diǎn)都是二叉排序樹上新的葉子節(jié)點(diǎn),則在進(jìn)行插入操作時(shí),不必移動(dòng)其他節(jié)點(diǎn),僅需改變某個(gè)節(jié)點(diǎn)的指針由空變?yōu)榉强占纯?。二叉排序樹的插入算法?lt;/p><p>  bstree InsertBST(bstree t,int key,nametype name,double grade)</p><p>  若二叉排序樹中不存在關(guān)鍵字等于key的數(shù)據(jù)

12、元素時(shí),插入元素并返回TRUE。</p><p><b>  2.5查找模塊</b></p><p>  二叉排序樹又稱二叉查找樹,當(dāng)二叉排序樹不為空時(shí),首先將給定的值和根節(jié)點(diǎn)的關(guān)鍵字比較,若相等則查找成功,否則將依據(jù)給定的值和根節(jié)點(diǎn)關(guān)鍵字之間的大小關(guān)系,分別在左子樹或右子樹上繼續(xù)進(jìn)行查找。為此定義一個(gè)二叉排序樹的查找算法為</p><p> 

13、 bstnode *SearchBST(bstree t,keytype key) </p><p>  在根指針t所指向的二叉排序樹中查找關(guān)鍵字等于key的數(shù)據(jù)元素,如成功,返回指向該元素節(jié)點(diǎn)的指針,否則返回空指針。</p><p>  2.6效率比較compare模塊</p><p>  void compare()對(duì)數(shù)組和二叉排序樹的查找效率進(jìn)行比較比較。

14、</p><p>  2.7二叉排序樹的遍歷</p><p>  先序遍歷也叫做先根遍歷。首先訪問(wèn)根結(jié)點(diǎn)然后遍歷左子樹,最后遍歷右子樹。在遍歷左、右子樹時(shí),仍然先訪問(wèn)根結(jié)點(diǎn),然后遍歷左子樹,最后遍歷右子樹,如果二叉樹為空則返回。其實(shí)過(guò)程為:先遍歷左子樹root->left->left->left...->null,由于是先序遍歷,因此一遇到節(jié)點(diǎn),便需要立即訪問(wèn);由于

15、一直走到最左邊后,需要逐步返回到父節(jié)點(diǎn)訪問(wèn)右節(jié)點(diǎn),因此必須有一個(gè)措施能夠?qū)?jié)點(diǎn)序列回溯。其一可以用棧記憶在訪問(wèn)途中將依次遇到的節(jié)點(diǎn)保存下來(lái)。根據(jù)棧的先進(jìn)后出、后進(jìn)先出的特點(diǎn)特點(diǎn)。則可以用棧保存。每次都將遇到的節(jié)點(diǎn)壓入棧,當(dāng)左子樹遍歷完畢后從棧中彈出最后一個(gè)訪問(wèn)的節(jié)點(diǎn),然后訪問(wèn)其右子樹。</p><p><b>  基本算法思想:</b></p><p>  1.先訪問(wèn)

16、根節(jié)點(diǎn),將根節(jié)點(diǎn)入棧</p><p>  2.重復(fù)執(zhí)行兩大步驟:如果該節(jié)點(diǎn)左孩子存在,則訪問(wèn)該左孩子節(jié)點(diǎn),并將其指針入棧。重復(fù)以上操作,直到節(jié)點(diǎn)的左孩子不存在。將棧頂?shù)脑?,即其指針出棧,回到父?jié)點(diǎn),如果該指針節(jié)點(diǎn)的右孩子存在,則將該指針指向的右孩子節(jié)點(diǎn)重復(fù)執(zhí)行以上步驟,直到桟為空為止。</p><p>  操作函數(shù)為void x_print(Tree T)</p><

17、p>  中序遍歷:中序遍歷和先序遍歷訪問(wèn)的順序不同。中序遍歷訪問(wèn)順序?yàn)橹行虮闅v左子數(shù),在訪問(wèn)根節(jié)點(diǎn),最后中序遍歷右子樹。先序遍歷是先訪問(wèn),再入棧;而中序遍歷則是先入棧,彈棧后再訪問(wèn)。將二叉樹的根節(jié)點(diǎn)入棧,如果該節(jié)點(diǎn)有左孩子,將左孩子直接入棧,重復(fù)該操作,直到該節(jié)點(diǎn)無(wú)左孩子;在將棧頂元素出棧,并訪問(wèn)該節(jié)點(diǎn)指向的節(jié)點(diǎn),如果該指針指向的右孩子存在,則將當(dāng)前指針指向右孩子節(jié)點(diǎn)。重復(fù)執(zhí)行步驟直到棧為空為止。</p><p

18、>  操作函數(shù)為void z_print(Tree T )。</p><p>  后序遍歷:先后序遍歷左子樹,在后序遍歷右子樹,最后訪問(wèn)根節(jié)點(diǎn)。先將根節(jié)點(diǎn)入棧,如果該節(jié)點(diǎn)左孩子節(jié)點(diǎn)存在,將該節(jié)點(diǎn)左孩子節(jié)點(diǎn)入棧。重復(fù)執(zhí)行此操作,直到節(jié)點(diǎn)左孩子節(jié)點(diǎn)為空。取棧頂元素,并賦值給P,如果P的右孩子為空或P的右孩子等于q(即如果p的右孩子已訪問(wèn),則訪問(wèn)根節(jié)點(diǎn),即p指向的節(jié)點(diǎn),并用q來(lái)記錄剛剛訪問(wèn)的節(jié)點(diǎn)的指針),若p有右

19、孩子,且右孩子沒(méi)有別訪問(wèn)過(guò),則p=p->rchild。</p><p>  操作函數(shù)為void h_print(Tree T)</p><p><b>  3.源代碼</b></p><p>  #include<stdio.h></p><p>  #include<iostream>

20、</p><p>  #include<string></p><p>  #include<time.h></p><p>  #include <iomanip></p><p>  using namespace std;</p><p>  typedef string n

21、ametype;</p><p>  typedef unsigned long keytype;</p><p>  typedef struct node //結(jié)點(diǎn)的結(jié)構(gòu)體</p><p><b>  {</b></p><p>  keytype key; </p>

22、<p>  nametype name; </p><p>  int grade;</p><p>  struct node *lchild,*rchild;</p><p><b>  }bstnode;</b></p><p>  typedef bstnode *bstree;</

23、p><p><b>  //棧的定義//</b></p><p>  typedef struct{ //棧結(jié)構(gòu)</p><p>  bstree *base;</p><p>  bstree *top;</p><p>  int stacksize;</p>

24、<p><b>  }Sqstack;</b></p><p>  int InitStack (Sqstack &s) //建立一個(gè)空棧</p><p><b>  {</b></p><p>  s.base=(bstree*)malloc(1000 * sizeof(int));</p>

25、;<p>  s.top=s.base;</p><p><b>  return 1;</b></p><p><b>  };</b></p><p>  int Push(Sqstack &s ,node *e)//在棧頂插入元素(進(jìn)棧)</p><p><b>

26、;  {</b></p><p><b>  *s.top=e;</b></p><p>  s.top=s.top+1;</p><p><b>  return 1;</b></p><p><b>  };</b></p><p>  

27、int Pop(Sqstack &s, bstree &e)//出棧</p><p><b>  {</b></p><p>  if(s.top==s.base)return 0;</p><p>  else s.top=s.top-1;</p><p><b>  e=*s.top;<

28、;/b></p><p><b>  return 1;</b></p><p><b>  };</b></p><p>  //非遞歸歷遍并輸出結(jié)點(diǎn)信息//</p><p>  /*---------------先序非遞歸遍歷---------------*/</p><

29、;p>  void x_print(node *t)</p><p><b>  {</b></p><p>  Sqstack s;</p><p>  InitStack(s);</p><p>  bstnode *p;</p><p><b>  p=t;</b>

30、;</p><p>  while(p||!(s.top==s.base))</p><p><b>  {</b></p><p><b>  if(p)</b></p><p><b>  { </b></p><p>  Push(s,p);<

31、;/p><p>  cout<<p->key<<"\t"<<setw(20);</p><p>  cout<<p->name<<"\t"<<setw(20);</p><p>  cout<<p->grade<<&q

32、uot;\t"<<endl;</p><p>  p=p->lchild;</p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p><

33、;b>  Pop(s,p);</b></p><p>  p=p->rchild;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*-

34、--------------中序非遞歸遍歷---------------*/</p><p>  void z_print(node *t)</p><p><b>  {</b></p><p>  Sqstack s;</p><p>  InitStack(s);</p><p>  bst

35、node *p;</p><p><b>  p=t;</b></p><p>  while(p||!(s.top==s.base))</p><p><b>  {</b></p><p><b>  if(p)</b></p><p><b&

36、gt;  { </b></p><p>  Push(s,p);</p><p>  p=p->lchild;</p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b>

37、;</p><p><b>  Pop(s,p);</b></p><p>  cout<<p->key<<"\t"<<setw(20);</p><p>  cout<<p->name<<"\t"<<setw(20);&

38、lt;/p><p>  cout<<p->grade<<"\t"<<endl;</p><p>  p=p->rchild;</p><p><b>  }</b></p><p><b>  }</b></p><

39、p><b>  }</b></p><p>  /*---------------非遞歸后序遍歷---------------*/</p><p>  void h_print(node *t)</p><p><b>  {</b></p><p>  Sqstack s;</p>

40、;<p>  InitStack(s);</p><p>  node *p,*q;</p><p><b>  p=t;</b></p><p><b>  q=NULL;</b></p><p>  while(p || !(s.top==s.base))</p>

41、<p><b>  {</b></p><p><b>  if(p){</b></p><p>  Push(s,p);</p><p>  p=p->lchild;</p><p><b>  }else</b></p><p>&l

42、t;b>  {</b></p><p>  p=*(s.top-1);</p><p>  if(p->rchild==q)</p><p><b>  {</b></p><p>  Pop(s,q);p=NULL;</p><p>  cout<<q->

43、;key<<"\t"<<setw(20);</p><p>  cout<<q->name<<"\t"<<setw(20);</p><p>  cout<<q->grade<<"\t"<<endl;</p>

44、<p><b>  }else</b></p><p><b>  {</b></p><p>  p=p->rchild;q=NULL;</p><p><b>  }</b></p><p><b>  }</b></p>

45、<p><b>  }</b></p><p><b>  }</b></p><p>  //遞歸查找二叉樹//</p><p>  /*---歸查找,若找到就返回指向該結(jié)點(diǎn)的指針,否則返回空---*/</p><p>  bstnode *SearchBST(bstree t,ke

46、ytype key) {</p><p>  if(t==NULL||key==t->key)</p><p><b>  return t;</b></p><p>  if(key<t->key)</p><p>  return SearchBST(t->lchild ,key);<

47、;/p><p><b>  else </b></p><p>  return SearchBST(t->rchild ,key);</p><p><b>  }</b></p><p>  //-------------------給定學(xué)生信息插入到二叉樹中-----------------

48、--//</p><p>  bstree InsertBST(bstree t,int key,nametype name,double grade)</p><p><b>  {</b></p><p>  bstree p,q;</p><p>  if(t==NULL) //樹初始為

49、空,新建二叉樹</p><p><b>  {</b></p><p>  t=new bstnode();</p><p>  t->key=key;</p><p>  t->name=name;</p><p>  t->grade=grade;</p>&l

50、t;p>  t->lchild=t->rchild=NULL;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  p=t;</b>&l

51、t;/p><p>  while(p) //樹已存在,按照二叉排序樹的特性查找</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  if(p->key>key)</p><p>  p=q->

52、lchild;</p><p>  else if(p->key<key)</p><p>  p=q->rchild;</p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<end

53、l;</p><p>  cout<<"樹中已有該節(jié)點(diǎn):"<<key<<endl;</p><p>  cout<<endl;</p><p><b>  return t;</b></p><p><b>  }</b></

54、p><p><b>  }</b></p><p>  p=new bstnode(); //找不到結(jié)點(diǎn)就新建一個(gè)結(jié)點(diǎn)插入到二叉排序樹中</p><p>  p->key=key;</p><p>  p->name=name;</p><p>  p->grade=gr

55、ade;</p><p>  p->lchild=p->rchild=NULL;</p><p>  if(q->key>key)</p><p>  q->lchild=p;</p><p><b>  else</b></p><p>  q->rchild

56、=p;</p><p><b>  }</b></p><p><b>  return t;</b></p><p><b>  }</b></p><p>  //-------------------二叉樹排序樹的構(gòu)建-------------------//</p

57、><p>  bstree CreatTree() //不斷輸入學(xué)生信息以插入到二叉樹中</p><p><b>  {</b></p><p>  bstree t=NULL;</p><p>  keytype key;</p><p>  nametype name;</

58、p><p>  double grade;</p><p>  cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b>  cin>>key;</b></p><p>  if(key==0)</p>

59、;<p><b>  return t;</b></p><p>  cin>>name;</p><p>  cin>>grade;</p><p>  while(key) //key==0時(shí)退出</p><p><b>  {</b><

60、/p><p>  t=InsertBST(t,key,name,grade);</p><p>  cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b>  cin>>key;</b></p><p>  i

61、f(key==0)</p><p><b>  break;</b></p><p>  cin>>name;</p><p>  cin>>grade;</p><p><b>  }</b></p><p><b>  return t;

62、</b></p><p><b>  }</b></p><p>  //-------------------刪除樹中的結(jié)點(diǎn)-------------------//</p><p>  void Delete(bstree &p) //刪除結(jié)點(diǎn)的函數(shù)</p><p><b>  

63、{</b></p><p>  bstree q,s;</p><p>  if(!p->rchild)</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  p=q->lchild ;</p&

64、gt;<p><b>  delete q;</b></p><p><b>  }</b></p><p>  else if(!p->lchild)</p><p><b>  {</b></p><p><b>  q=p;</b>

65、;</p><p>  p=p->rchild;</p><p><b>  delete q;</b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b&

66、gt;</p><p><b>  q=p;</b></p><p>  s=p->lchild;</p><p>  while(s->rchild)</p><p><b>  {</b></p><p><b>  q=s;</b>&l

67、t;/p><p>  s=s->rchild;</p><p><b>  }</b></p><p>  p->name=s->name;</p><p><b>  if(q!=p)</b></p><p>  q->rchild=s->lchi

68、ld;</p><p><b>  else</b></p><p>  q->lchild=s->lchild;</p><p><b>  delete s;</b></p><p><b>  }</b></p><p><b&g

69、t;  }</b></p><p>  void DeleteData(bstree &t,keytype key)</p><p><b>  {</b></p><p><b>  if(!t){</b></p><p>  cout<<"沒(méi)有該信息,請(qǐng)

70、重新輸入!";</p><p><b>  cin>>key;</b></p><p>  DeleteData(t,key);</p><p><b>  }</b></p><p><b>  else</b></p><p>

71、<b>  {</b></p><p>  if(t->key==key)</p><p><b>  {</b></p><p>  Delete(t); //若找到結(jié)點(diǎn)直接刪除</p><p>  cout<<"刪除成功!"<<endl;

72、</p><p><b>  }</b></p><p>  else if(t->key>key)</p><p>  DeleteData(t->lchild,key); //結(jié)點(diǎn)數(shù)據(jù)比查找關(guān)鍵字大,繼續(xù)在其左子樹中查找</p><p><b>  else</b><

73、;/p><p>  DeleteData(t->rchild,key); //結(jié)點(diǎn)數(shù)據(jù)比查找關(guān)鍵字小,繼續(xù)在其右子樹中查找</p><p><b>  }</b></p><p><b>  }</b></p><p>  //數(shù)組和二叉排序樹的查找效率比較//</p><

74、p>  void compare()</p><p><b>  {</b></p><p>  bstree t=NULL;</p><p>  clock_t start,end,start1,end1;</p><p>  int num=0;</p><p><b>  

75、int a=0;</b></p><p><b>  int b=0;</b></p><p><b>  int c=0;</b></p><p><b>  int d=1;</b></p><p><b>  bstree p;</b>&

76、lt;/p><p>  string key,name;</p><p>  double grade;</p><p>  nametype str [100][3];</p><p>  //cout<<"(輸入0時(shí)結(jié)束)"<<endl;</p><p>  cout<

77、<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b>  cin>>key;</b></p><p>  if(key=="0")</p><p><b>  return ;</b></p>

78、;<p>  cin>>name;</p><p>  cin>>grade;</p><p>  while(key!="0")</p><p><b>  {</b></p><p>  str[num][0]=key;</p><p>

79、;  str[num][1]=name;</p><p>  str[num][2]=grade;</p><p>  int key1=atoi(key.c_str()); //用庫(kù)函數(shù)將字符串轉(zhuǎn)化為關(guān)鍵字的int型</p><p>  t=InsertBST(t,key1,name,grade); //插入結(jié)點(diǎn)</p><p>  

80、cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b>  cin>>key;</b></p><p>  if(key=="0")</p><p><b>  break;</b><

81、;/p><p>  cin>>name;</p><p>  cin>>grade;</p><p><b>  num++;</b></p><p><b>  }</b></p><p>  cout<<endl;</p>&

82、lt;p>  cout<<"進(jìn)行數(shù)組和二叉排序樹的查詢效率比較(比較:1 不比較:0)";</p><p><b>  cin>>d;</b></p><p>  while(d!=NULL)</p><p><b>  {</b></p><p>

83、;<b>  switch(d)</b></p><p><b>  {</b></p><p><b>  case 0: </b></p><p>  cout<<"返回選擇界面"<<endl;</p><p><b>

84、  break;</b></p><p><b>  case 1:</b></p><p>  cout<<"數(shù)組查詢!"<<endl;</p><p>  cout<<"請(qǐng)輸入查詢的成績(jī):"<<endl;</p><p&g

85、t;<b>  cin>>key;</b></p><p>  start=clock();</p><p>  while(a<=10000000) //循環(huán)模擬數(shù)組查找</p><p><b>  {</b></p><p>  while(b<=99)

86、</p><p><b>  {</b></p><p>  if(str[b][0]==key)</p><p><b>  {b=100;}</b></p><p><b>  else</b></p><p><b>  b++;<

87、/b></p><p><b>  }</b></p><p><b>  b=0;</b></p><p><b>  a++;</b></p><p><b>  }</b></p><p>  end=clock();&

88、lt;/p><p>  if(num>=100)</p><p>  cout<<"數(shù)組查詢:無(wú)查詢信息,花費(fèi)時(shí)間: "<<end-start<<" 毫秒"<<endl;</p><p><b>  else</b></p><p&g

89、t;  cout<<"數(shù)組查詢:查到信息,花費(fèi)時(shí)間: "<<end-start<<" 毫秒"<<endl;</p><p>  int key1=atoi(key.c_str()); //同上轉(zhuǎn)化</p><p>  start1=clock();</p><p>  w

90、hile(c<=10000000) //用循環(huán)來(lái)模擬樹中查找</p><p><b>  {</b></p><p>  p=SearchBST(t,key1);</p><p><b>  c++;</b></p><p><b>  }</b></

91、p><p>  end1=clock();</p><p>  if(p==NULL)</p><p>  cout<<"樹查詢:無(wú)查詢信息,花費(fèi)時(shí)間: "<<end1-start1<<" 毫秒"<<endl;</p><p><b>  else

92、</b></p><p>  cout<<"樹查詢:查到信息,花費(fèi)時(shí)間: "<<end1-start1<<" 毫秒"<<endl;</p><p><b>  a=0;</b></p><p><b>  b=0;</b>

93、</p><p><b>  c=0;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  cout<<"是否繼續(xù)進(jìn)行操作(是:1 否:0):";</p><p

94、><b>  cin>>d;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //二叉樹的深度</b></p><p>  int TreeDepth(bstree t)

95、</p><p><b>  {</b></p><p>  int left,right,max;</p><p>  if(t!=NULL)</p><p><b>  {</b></p><p>  left=TreeDepth(t->lchild);</p

96、><p>  right=TreeDepth(t->rchild);</p><p>  max=left>right?left:right;</p><p>  return max+1;</p><p><b>  }else</b></p><p><b>  {</

97、b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //樹狀輸出二叉樹</b></p><p>  void

98、 PrintTree(bstree t,int layer)</p><p><b>  {</b></p><p><b>  int k;</b></p><p>  if(t==NULL)</p><p><b>  return ;</b></p><

99、;p>  PrintTree(t->rchild,layer+1);</p><p>  for(k=0;k<layer;k++)</p><p>  cout<<" ";</p><p>  cout<<t->key<<"\n";</p><

100、;p>  PrintTree(t->lchild,layer+1);</p><p><b>  }</b></p><p>  //-------------------主函數(shù)測(cè)試-------------------//</p><p>  int main()</p><p><b>  {&

101、lt;/b></p><p><b>  int d;</b></p><p>  keytype key;</p><p>  bstree t=NULL;</p><p>  t=CreatTree();</p><p>  d=TreeDepth(t);</p><

102、p>  cout<<"二叉排序樹的樹形表示如下"<<endl;</p><p>  PrintTree(t,d);</p><p>  char choose;</p><p>  nametype name;</p><p><b>  bstree p;</b><

103、;/p><p>  double grade;</p><p>  cout<<" "<<endl;</p><p>  cout<<"-----------------------------請(qǐng)輸入你要選擇的操作-------------------------------"<<e

104、ndl;</p><p>  cout<<" |-------------------------------------|"<<endl;</p><p>  cout<<" ||----------------------------------

105、-||"<<endl;</p><p>  cout<<" || a 插入信息 ||"<<endl;</p><p>  cout<<" || b 刪除信息

106、 ||"<<endl;</p><p>  cout<<" || c 查詢信息 ||"<<endl;</p><p>  cout<<" || d

107、 修改信息 ||"<<endl;</p><p>  cout<<" || 0 退出 ||"<<endl;</p><p>  cout<<"

108、|| e 對(duì)二叉排序樹進(jìn)行非遞歸遍歷 ||"<<endl;</p><p>  cout<<" || f 進(jìn)行數(shù)組和二叉樹查找效率實(shí)驗(yàn)||"<<endl;</p><p>  cout<<" ||-------

109、----------------------------||"<<endl;</p><p>  cout<<" |-------------------------------------|"<<endl;</p><p>  cout<<endl;</p>

110、<p>  cout<<"需要選擇的操作為:";</p><p>  cin>>choose;</p><p>  cout<<endl;</p><p>  while(choose)</p><p><b>  {</b></p><

111、;p>  switch(choose)</p><p><b>  {</b></p><p><b>  case 'a':</b></p><p>  //cout<<"輸入學(xué)生信息信息(學(xué)號(hào)為0時(shí)結(jié)束)."<<endl;</p><

112、p>  cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b>  cin>>key;</b></p><p>  if(key==0) /*{</p><p>  PrintTree(t,d);</p>&l

113、t;p><b>  break;}*/</b></p><p>  cin>>name;</p><p>  cin>>grade;</p><p>  while(key) </p><p><b>  {</b></p><p>

114、  t=InsertBST(t,key,name,grade);</p><p>  cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---:"<<endl;</p><p><b>  cin>>key;</b></p><p>  if(key==0)</p><

115、p><b>  break;</b></p><p>  cin>>name;</p><p>  cin>>grade;</p><p><b>  }</b></p><p><b>  break;</b></p><p&

116、gt;<b>  case 'b':</b></p><p>  cout<<"請(qǐng)輸入要?jiǎng)h除信息學(xué)生的成績(jī):"<<endl;</p><p><b>  cin>>key;</b></p><p>  DeleteData(t,key);</p&

117、gt;<p>  d=TreeDepth(t);</p><p>  cout<<"刪除結(jié)點(diǎn)后二叉樹的樹形顯示如下"<<endl;</p><p>  PrintTree(t,d);</p><p><b>  break;</b></p><p><b&g

118、t;  case 'c':</b></p><p>  cout<<"請(qǐng)輸入要查詢的成績(jī):"<<endl;</p><p><b>  cin>>key;</b></p><p>  p=SearchBST(t,key);</p><p>

119、;  if(p==NULL)</p><p>  cout<<"無(wú)查詢的關(guān)鍵字:"<<key<<endl;</p><p><b>  else</b></p><p>  cout<<"成績(jī)"<<"\t"<<se

120、tw(20)<<"姓名"<<"\t"<<setw(20)<<"學(xué)號(hào)"<<endl;</p><p>  cout<<p->key<<"\t"<<setw(20);</p><p>  cout<<p

121、->name<<"\t"<<setw(20);</p><p>  cout<<p->grade<<endl;</p><p><b>  break;</b></p><p><b>  case 'd':</b></p

122、><p>  cout<<"請(qǐng)輸入要修改的學(xué)號(hào):"<<endl;</p><p><b>  cin>>key;</b></p><p>  p=SearchBST(t,key);</p><p>  if(p==NULL)</p><p>  

123、cout<<"無(wú)你所要修改的關(guān)鍵字:"<<key<<endl;</p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<"請(qǐng)輸入修改的姓名:";</p><

124、;p>  cin>>name;</p><p>  cout<<"請(qǐng)輸入修改的成績(jī):";</p><p>  cin>>grade;</p><p>  p->name=name;</p><p>  p->grade=grade;</p><p&g

125、t;<b>  }</b></p><p><b>  break;</b></p><p><b>  case 'e':</b></p><p><b>  if(!t)</b></p><p>  cout<<"

126、沒(méi)有任何信息,請(qǐng)先輸入信息!";</p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<"學(xué)號(hào)"<<"\t"<<setw(20)<<"姓名"&

127、lt;<"\t"<<setw(20)<<"成績(jī)"<<endl;</p><p>  cout<<"------------------非遞歸先序遍歷----------------"<<endl;</p><p>  cout<<endl;</p&

128、gt;<p>  x_print(t);</p><p>  cout<<"------------------非遞歸中序遍歷-----------------"<<endl;</p><p>  cout<<endl;</p><p>  z_print(t);</p><p

129、>  cout<<"------------------非遞歸后序遍歷-----------------"<<endl;</p><p>  cout<<endl;</p><p>  h_print(t);</p><p><b>  }</b></p><p&

130、gt;<b>  break;</b></p><p><b>  case 'f':</b></p><p>  cout<<"***此實(shí)驗(yàn)為獨(dú)立實(shí)驗(yàn),實(shí)驗(yàn)數(shù)據(jù)獨(dú)立于外部數(shù)據(jù)***"<<endl;</p><p>  cout<<"***請(qǐng)

131、重新輸入相關(guān)信息***"<<endl;</p><p>  compare();</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  cout<<"選擇錯(cuò)誤!";</p

132、><p><b>  break;</b></p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<endl;</p><p>  cout<<" "<<

133、;endl;</p><p>  cout<<"-----------------------------請(qǐng)輸入你要選擇的操作-------------------------------"<<endl;</p><p>  cout<<" |----------------------

134、---------------|"<<endl;</p><p>  cout<<" ||-----------------------------------||"<<endl;</p><p>  cout<<" ||

135、 a 插入信息 ||"<<endl;</p><p>  cout<<" || b 刪除信息 ||"<<endl;</p><p>  cout<<"

136、 || c 查詢信息 ||"<<endl;</p><p>  cout<<" || d 修改信息 ||"<<endl;</p><p>  cout<<"

137、 || 0 退出 ||"<<endl;</p><p>  cout<<" || e 對(duì)二叉排序樹進(jìn)行非遞歸遍歷 ||"<<endl;</p><p>  cout<<"

138、 || f 進(jìn)行數(shù)組和二叉樹查找效率實(shí)驗(yàn)||"<<endl;</p><p>  cout<<" ||-----------------------------------||"<<endl;</p><p>  cout<<&quo

139、t; |-------------------------------------|"<<endl;</p><p>  cout<<endl;</p><p>  cout<<"選擇的操作位:";</p><p>  cin>>choose;<

140、/p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  4.運(yùn)行結(jié)果及截圖</b

141、></p><p><b>  從鍵盤讀入數(shù)據(jù)</b></p><p>  以0作為結(jié)束標(biāo)志可得二叉排序樹樹狀表示</p><p><b>  主菜單選擇模塊</b></p><p>  需要在樹種添加節(jié)點(diǎn)則執(zhí)行操作a</p><p>  需要在書中刪除節(jié)點(diǎn)執(zhí)行操作b&

142、lt;/p><p>  需要查詢節(jié)點(diǎn)信息執(zhí)行操作c</p><p>  修改某一節(jié)點(diǎn)信息執(zhí)行操作d</p><p>  執(zhí)行操作0退出程序執(zhí)行</p><p>  執(zhí)行操作e對(duì)樹進(jìn)行先序遍歷、后序遍歷、中序遍歷運(yùn)行結(jié)果如下圖</p><p>  需要對(duì)樹和數(shù)組的查詢效率比較執(zhí)行操作f</p><p>

143、;  4.實(shí)驗(yàn)結(jié)論 </p><p>  棧是僅表尾進(jìn)行插入和刪除的線性表,棧的順序存儲(chǔ)結(jié)構(gòu)是利用一組地址連續(xù)的存儲(chǔ)單元依次存放自棧底到棧頂?shù)臄?shù)據(jù)元素,并同時(shí)附設(shè)指針top指示棧頂元素在順序棧中的位置。</p><p>  從數(shù)組查詢和樹查詢的時(shí)間可得出,樹的查詢比數(shù)組的查詢時(shí)間快得多。但是二叉樹的平均查找長(zhǎng)度和樹的形態(tài)有關(guān),當(dāng)先后插入的關(guān)鍵字是有序樹時(shí),構(gòu)造的二叉樹蛻變?yōu)閱芜厴?/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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論