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

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)學(xué)與計算機學(xué)院</b></p><p><b>  課程設(shè)計說明書</b></p><p>  課 程 名 稱: 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計 </p><p>  課 程 代 碼: </p><p>  題 目: 線索二

2、叉樹的基本操作 </p><p>  年級/專業(yè)/班: 2012級軟件工程4班 </p><p>  學(xué) 生 姓 名: 吳海燕 </p><p>  學(xué) 號: </p><p>  開 始

3、時 間: 2013 年 12 月 18 日</p><p>  完 成 時 間: 2013 年 12 月 28 日</p><p><b>  課程設(shè)計成績:</b></p><p>  指導(dǎo)教師簽名: 年 月 日</p><p><b>  目 錄

4、</b></p><p><b>  1 需求分析1</b></p><p>  1.1任務(wù)與分析1</p><p><b>  1.2測試數(shù)據(jù)2</b></p><p><b>  2 概要設(shè)計3</b></p><p>  2.1

5、 模塊劃分3</p><p>  2.2模塊中的層次圖3</p><p><b>  3 詳細(xì)設(shè)計4</b></p><p>  3.1結(jié)構(gòu)體設(shè)計4</p><p>  3.2創(chuàng)建二叉樹4</p><p>  3.3二叉樹線索化5</p><p>  3.4二叉

6、樹中插入結(jié)點6</p><p>  3.5刪除結(jié)點函數(shù)8</p><p>  3.6查找前驅(qū)后繼函數(shù)11</p><p><b>  4 調(diào)試分析12</b></p><p>  5 用戶使用說明12</p><p><b>  6 測試結(jié)果12</b></

7、p><p>  6.1新建二叉樹12</p><p>  6.2中序遍歷13</p><p>  6.3查找前驅(qū)13</p><p>  6.4查找后繼14</p><p>  6.5刪除結(jié)點14</p><p>  6.6插入左孩子15</p><p>  6.

8、7插入右孩子15</p><p><b>  6.8退出16</b></p><p><b>  結(jié) 論17</b></p><p><b>  致 謝18</b></p><p><b>  參考文獻(xiàn)19</b></p>&l

9、t;p><b>  摘 要 </b></p><p>  首先是對需求分析的簡要闡述,說明系統(tǒng)要完成的任務(wù)和相應(yīng)的分析,并給出測試數(shù)據(jù)。其次是概要設(shè)計,說明模塊的劃分以及模塊間的層次關(guān)系,然后是詳細(xì)設(shè)計,描述實現(xiàn)概要設(shè)計中定義的基本功操作和所有數(shù)據(jù)類型,以及函數(shù)的功能及代碼實現(xiàn)。再次是對系統(tǒng)的調(diào)試分析說明,以及遇到的問題和解決問題的方法。然后是用戶使用說明書的闡述,然后是測試的數(shù)據(jù)

10、和結(jié)果的分析,最后是對本次課程設(shè)計的結(jié)論。</p><p>  關(guān)鍵詞:線索化,中序遍歷,插入,刪除,查找</p><p><b>  引 言</b></p><p>  數(shù)據(jù)結(jié)構(gòu)是計算機專業(yè)重要的專業(yè)基礎(chǔ)課程與核心課程之一,在計算機領(lǐng)域應(yīng)用廣泛,計算機離不開數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計為了能使我們掌握所學(xué)習(xí)的知識并有應(yīng)用到實際的設(shè)計中的能力,

11、對于掌握這門課程的學(xué)習(xí)方法有極大的意義。本課程設(shè)計的題目為“線索二叉樹的基本操作”,完成將二叉樹轉(zhuǎn)化成線索二叉樹,采用中序線索二叉樹的操作。本課程設(shè)計采用的編程環(huán)境為Microsoft Visual Studio 2008。</p><p><b>  1 需求分析 </b></p><p>  當(dāng)用二叉鏈表作為二叉樹的存儲結(jié)構(gòu)時,因為每個結(jié)點中只有指向其左、右兒子結(jié)

12、點的指針,所以從任一結(jié)點出發(fā)只能直接找到該結(jié)點的左、右兒子。在一般情況下靠它無法直接找到該結(jié)點在某種遍歷序下的前驅(qū)和后繼結(jié)點。如果在每個結(jié)點中增加指向其前驅(qū)和后繼結(jié)點的指針,將降低存儲空間的效率。</p><p>  我們可以證明:在n個結(jié)點的二叉鏈表中含有n+1個空指針。因為含n個結(jié)點的二叉鏈表中含有2n個指針,除了根結(jié)點,每個結(jié)點都有一個從父結(jié)點指向該結(jié)點的指針,因此一共使用了n-1個指針,所以在n個結(jié)點的二

13、叉鏈表中含有n+1個空指針。</p><p>  因此可以利用這些空指針,存放指向結(jié)點在某種遍歷次序下的前驅(qū)和后繼結(jié)點的指針。這種附加的指針稱為線索,加上了線索的二叉鏈表稱為線索鏈表,相應(yīng)的二叉樹稱為線索二叉樹(Threaded Binary Tree)。根據(jù)線索性質(zhì)的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和后序線索二叉樹三種。</p><p><b>  1.1任

14、務(wù)與分析 </b></p><p><b>  任務(wù):</b></p><p>  建立一棵二叉樹(用戶自行輸入二叉樹,用“#”表示空格,按回車鍵結(jié)束),將其線索化,并實現(xiàn)以下功能:</p><p>  1)遍歷二叉樹(本程序使用中序遍歷方法)</p><p>  2)在二叉樹中插入一個結(jié)點</p>

15、;<p>  3)刪除二叉樹的某個結(jié)點</p><p>  4)查找某個結(jié)點的前驅(qū)</p><p>  5)查找某個結(jié)點的后繼</p><p><b>  分析:</b></p><p>  該任務(wù)是關(guān)于線索二叉樹的運算,其中的基本運算應(yīng)基于二叉樹,但又有所不同,首先應(yīng)了解的問題有:</p>

16、<p>  1)線索二叉樹是如何建立的,是通過二叉樹來實現(xiàn)線索化,還是直接進(jìn)行線索化的輸入。若由二叉樹建立而來,該二叉樹應(yīng)如何輸入,對于具體的二叉樹應(yīng)該使初使用者明白使用的格式。</p><p>  2)該程序重點內(nèi)容是有關(guān)于二叉樹的插入、刪除和查找前驅(qū)后繼,在進(jìn)行具體的操作時,規(guī)則是什么,依照什么原則。</p><p>  3)對于插入、刪除、查找前驅(qū)后繼等,其結(jié)果是否符合預(yù)訂

17、的目標(biāo),須由自己判定。</p><p><b>  1.2測試數(shù)據(jù) </b></p><p>  測試數(shù)據(jù):ABD#G###CE##F##</p><p><b>  圖1-1 測試數(shù)據(jù)</b></p><p><b>  2 概要設(shè)計 </b></p><

18、;p><b>  2.1 模塊劃分</b></p><p>  二叉樹的建立函數(shù):Creat(ThrNode<T> *bt)</p><p>  中序遍歷函數(shù):void InOrder()</p><p>  中序線索化函數(shù):void ThrBiTree(ThrNode<T>*bt)</p><

19、p>  查找結(jié)點函數(shù):ThrNode<T>*locate(ThrNode<T>*bt,T x)</p><p>  插入結(jié)點函數(shù):void InsertLeft(ThrNode<T>*s,T x,T y)</p><p>  void InsertRight(ThrNode<T>*s,T x,T y)</p><p&

20、gt;  刪除函數(shù):void Delete(ThrNode<T>*child ,ThrNode<T>*F)</p><p>  查找結(jié)點的前驅(qū)、后繼函數(shù):ThrNode<T>*Former(ThrNode<T>*p)</p><p>  ThrNode<T>*Next(ThrNode<T>*p)</p>

21、<p>  2.2模塊中的層次圖</p><p><b>  圖2-1層次模塊圖</b></p><p><b>  3 詳細(xì)設(shè)計</b></p><p><b>  3.1結(jié)構(gòu)體設(shè)計</b></p><p>  二叉樹的遍歷本質(zhì)上是將一個復(fù)雜的非線性結(jié)構(gòu)轉(zhuǎn)換為線性結(jié)

22、構(gòu),使每個結(jié)點都有了唯一前驅(qū)和后繼(第一個結(jié)點無前驅(qū),最后一個結(jié)點無后繼)。對于二叉樹的一個結(jié)點,查找其左右子女是方便的,其前驅(qū)后繼只有在遍歷中得到。為了容易找到前驅(qū)和后繼,有兩種方法。一是在結(jié)點結(jié)構(gòu)中增加向前和向后的指針,這種方法增加了存儲開銷,不可?。欢抢枚鏄涞目真溨羔槨,F(xiàn)將二叉樹的結(jié)點結(jié)構(gòu)重新定義如下:</p><p>  struct ThrNode</p><p><

23、b>  {</b></p><p><b>  T data;</b></p><p>  ThrNode<T> *lchild, *rchild;</p><p>  int ltag,rtag;</p><p><b>  };</b></p><

24、;p>  其中:ltag=0 時 lchild指向左子女;</p><p>  ltag=1 時 lchild指向前驅(qū); </p><p>  rtag=0 時 rchild指向左子女; </p><p>  rtag=1 時 rchild指向后繼; </p><p>  以這種結(jié)點結(jié)構(gòu)構(gòu)成的二叉鏈表作為二叉樹的存儲結(jié)構(gòu),叫做線索鏈表

25、,指向前驅(qū)和后繼的指針叫線索,加上線索的二叉樹叫線索二叉樹,對二叉樹進(jìn)行某種形式遍歷使其變?yōu)榫€索二叉樹的過程叫線索化。 學(xué)習(xí)線索化時,有三點必須注意:一是何種“序”的線索化,是先序、中序還是后序;二是要“前驅(qū)”線索化、“后繼”線索化還是“全”線索化(前驅(qū)后繼都要);三是只有空指針處才能加線索。</p><p><b>  3.2創(chuàng)建二叉樹</b></p><p>  

26、采用遞歸算法實現(xiàn)二叉樹的建立,按照某種次序依次輸入二叉樹中結(jié)點,用“#”表示結(jié)束標(biāo)志。</p><p>  template<class T></p><p>  ThrNode<T>*MyTree<T>::Creat(ThrNode<T> *bt) //建立一棵線索二叉樹</p><p><b>  {&

27、lt;/b></p><p><b>  char ch;</b></p><p>  cout<<"請輸入一個結(jié)點:";</p><p><b>  cin>>ch;</b></p><p>  if(ch=='#') bt=NUL

28、L; //建立一棵空樹</p><p><b>  else</b></p><p><b>  {</b></p><p>  bt=new ThrNode<T>;</p><p>  bt->data=ch; //生成一個結(jié)點</p><p&

29、gt;  bt->ltag=0; //左標(biāo)志置為</p><p>  bt->rtag=0; //右標(biāo)志置為</p><p>  bt->lchild=Creat(bt->lchild); //遞歸建立左子樹</p><p>  bt->rchild=Creat(bt->rchild); //遞歸建立右子樹

30、</p><p><b>  }</b></p><p>  return bt;</p><p><b>  }</b></p><p><b>  3.3二叉樹線索化</b></p><p>  按照一定的順序來進(jìn)行線索化。要實現(xiàn)線索化,就要知道結(jié)

31、點*pre是結(jié)點*p的前驅(qū),而*p是*pre的后繼。這樣,當(dāng)遍歷到結(jié)點*p時,可以進(jìn)行,若*p有空指針域,則將相應(yīng)的標(biāo)志置1;若*p的左線索標(biāo)志已經(jīng)建立(p->ltag==1),則可使其前驅(qū)線索化,令p->lchild=pre;若*pre的右線索標(biāo)志已經(jīng)建立(pre->rtag==1),則可使其后繼化,令pre->rchild=p;</p><p>  template<class

32、T> //中序線索化鏈表</p><p>  void MyTree<T>::ThrBiTree(ThrNode<T> *bt)</p><p><b>  {</b></p><p>  if(bt==NULL)</p><p><b>  return;</b>&

33、lt;/p><p>  ThrBiTree(bt->lchild);</p><p>  if(bt->lchild==NULL) //對bt的左指針進(jìn)行處理</p><p><b>  {</b></p><p>  bt->ltag=1;</p><p>  bt->lc

34、hild=pre; //設(shè)置pre的前驅(qū)線索</p><p><b>  }</b></p><p>  if(bt->rchild==NULL) //對bt的右指針進(jìn)行處理</p><p>  bt->rtag=1;</p><p>  if(pre!=NULL&&pre->rta

35、g==1) //設(shè)置pre的后繼線索</p><p>  pre->rchild=bt;</p><p><b>  pre=bt;</b></p><p>  ThrBiTree(bt->rchild);</p><p><b>  }</b></p><p>

36、  3.4二叉樹中插入結(jié)點</p><p>  在樹中插入一個結(jié)點,就必須要以一定的規(guī)則來進(jìn)行插入。首先要找到待插入結(jié)點的父結(jié)點,然后選擇是左孩子還是右孩子插入,再看要插入的位置是否已經(jīng)有其他結(jié)點,若有,則將要插入的結(jié)點作為該結(jié)點的前驅(qū)插入樹中,若沒有則直接插入。</p><p>  template<class T> //插入左孩子</p><p>

37、;  void MyTree<T>::InsertLeft(ThrNode<T>*s,T x,T y)</p><p><b>  {</b></p><p>  ThrNode<T> *newL,*t;//newL是待插入結(jié)點,*t是*s的前驅(qū)結(jié)點</p><p>  s=locate(s,x);</

38、p><p><b>  if(s==0)</b></p><p><b>  {</b></p><p>  cout<<"插入出錯!"<<endl;</p><p><b>  return;</b></p><p&

39、gt;<b>  }</b></p><p>  newL=new ThrNode<T>;</p><p>  newL->data=y;</p><p>  newL->lchild=NULL;</p><p>  newL->rchild=NULL;</p><p&g

40、t;  if(s->ltag==1)</p><p><b>  {</b></p><p>  t=s->lchild; //記住s的前驅(qū)結(jié)點,作為newL的前驅(qū)</p><p>  newL->lchild=t; //將待插入結(jié)點前驅(qū)化</p><p>  newL->ltag=1;&l

41、t;/p><p>  s->lchild=newL; //將待插入結(jié)點插入,作為s的左孩子</p><p>  s->ltag=0;</p><p>  newL->rchild=s; //將插入結(jié)點后繼化</p><p>  newL->rtag=1;</p><p><b>

42、  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(t=s->lchild;t->rtag==0;)// 確定*s的前驅(qū)結(jié)點</p><p>  t=t->rchild;// *s的前驅(qū)*t是

43、*s左孩子的最右下方的結(jié)點</p><p>  t->rchild=newL;// 后繼化</p><p>  newL->ltag=0;</p><p>  newL->lchild=s->lchild;//將插入結(jié)點前驅(qū)化</p><p><b>  }</b></p><

44、p>  s->ltag=0;</p><p>  s->lchild=newL;// 將待插入結(jié)點插入,作為s的左孩子</p><p>  newL->rtag=1;</p><p>  newL->rchild=s;// 將插入結(jié)點后繼化</p><p><b>  }</b></p

45、><p>  template<class T> //插入右孩子</p><p>  void MyTree<T>::InsertRight(ThrNode<T>*s,T x,T y)</p><p><b>  {</b></p><p>  ThrNode<T> *n

46、ewR,*t;//newR是待插入結(jié)點,*t是*s的后繼結(jié)點</p><p>  s=locate(s,x);</p><p><b>  if(s==0)</b></p><p><b>  {</b></p><p>  cout<<"插入出錯!";</p

47、><p><b>  return;</b></p><p><b>  }</b></p><p>  newR=new ThrNode<T>;</p><p>  newR->data=y;</p><p>  newR->lchild=NULL;&l

48、t;/p><p>  newR->rchild=NULL;</p><p>  if(s->rtag==1)</p><p><b>  {</b></p><p>  t=s->rchild; //記住s的后繼結(jié)點,作為newR的后繼</p><p>  newR->

49、rchild=t; //將待插入結(jié)點后繼化</p><p>  newR->rtag=1;</p><p>  s->rchild=newR; //將待插入結(jié)點插入,作為s的右孩子</p><p>  s->rtag=0;</p><p>  newR->lchild=s; //將插入點前驅(qū)化</

50、p><p>  newR->ltag=1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(t=s->rchild;t->lt

51、ag==0;)// 確定*s的后繼結(jié)點</p><p>  t=t->lchild;// *s的后繼*t是*s右孩子的最左下方的結(jié)點</p><p>  t->lchild=newR;//前驅(qū)化</p><p>  newR->rtag=0;</p><p>  newR->rchild=s->rchild;//

52、 s原來的后繼作為插入點的右孩子 </p><p><b>  }</b></p><p>  s->rtag=0;</p><p>  s->rchild=newR;// 將待插入結(jié)點插入,作為s的右孩子</p><p>  newR->ltag=1;</p><p>  ne

53、wR->lchild=s;// 插入點前驅(qū)化 </p><p><b>  }</b></p><p><b>  3.5刪除結(jié)點函數(shù)</b></p><p>  要在樹中刪除一個結(jié)點,也要考慮不同的情況。在刪除結(jié)點前要先找到該結(jié)點和它的父結(jié)點,然后再進(jìn)行刪除操作。</p><p><b

54、>  刪除的具體情況:</b></p><p>  1).當(dāng)結(jié)點是父親結(jié)點的左孩子時 </p><p>  若孩子結(jié)點沒有左右孩子:則直接刪除; </p><p>  若孩子結(jié)點有左孩子沒右孩子:則將孩子結(jié)點的左孩子給父親結(jié)點的左孩子; </p><p>  若孩子結(jié)點有右孩子沒左孩子:則將孩子

55、結(jié)點的右孩子給父親結(jié)點的左孩子;4.若孩子結(jié)點左右孩子都有:將左孩子上提,孩子結(jié)點的左子樹的右子樹接到孩子結(jié)點的右子樹的最左下結(jié)點的左子樹,再將孩子結(jié)點的右子樹接到孩子結(jié)點左子樹的右子樹。 </p><p>  2).當(dāng)結(jié)點是父親結(jié)點的右孩子: </p><p>  1.若孩子結(jié)點沒有左右孩子:則直接刪除; </p><p>  2.若

56、孩子結(jié)點有左孩子沒右孩子:則將孩子結(jié)點的左孩子給父親結(jié)點的右孩子;</p><p>  3.若孩子結(jié)點有右孩子沒左孩子:則將孩子結(jié)點的右孩子給父親結(jié)點的右孩子;</p><p>  4.若孩子結(jié)點左右孩子都有:將右孩子上提,將孩子結(jié)點的右子樹的左子樹接到孩子結(jié)點的左子樹的最右下結(jié)點的右子樹,再將孩子結(jié)點的左子樹接到孩子結(jié)點右子樹的左子樹。</p><p>  tem

57、plate<class T>//刪除結(jié)點</p><p>  void MyTree<T>::Delete(ThrNode<T>*child ,ThrNode<T>*F)//child為待刪除的結(jié)點,F(xiàn)是child的父結(jié)點</p><p><b>  {</b></p><p>  ThrNode

58、<T>*s;</p><p><b>  s=0;</b></p><p>  if(child==F->lchild||child==F)//是父親結(jié)點的左孩子</p><p><b>  {</b></p><p>  if(child->ltag==1&&

59、;child->rtag==1)//孩子結(jié)點左右為空</p><p><b>  {</b></p><p>  F->lchild=child->lchild;//child結(jié)點后繼指向F,只要保存前驅(qū)</p><p>  F->ltag=1;</p><p><b>  }</

60、b></p><p>  else if(child->ltag==0&&child->rtag==1)//孩子結(jié)點有左孩子無右孩子</p><p><b>  {</b></p><p>  F->lchild=child->lchild;//把child左孩子向上提,即刪除child</p

61、><p>  s=child->lchild;</p><p>  while(s->rchild)//查找child左孩子最右下結(jié)點</p><p>  s=s->rchild;</p><p>  s->rchild=child->rchild;//后繼化</p><p><b>

62、;  }</b></p><p>  else if(child->ltag==1&&child->rtag==0)//孩子結(jié)點有右孩子無左孩子</p><p><b>  {</b></p><p>  F->lchild=child->rchild;//把右孩子上提,即刪除child<

63、;/p><p>  s=child->rchild;</p><p>  while(s->lchild)//查找child右孩子的最左下結(jié)點</p><p>  s=s->lchild;</p><p>  s->lchild=child->lchild;//前驅(qū)化</p><p><

64、b>  }</b></p><p>  else if(child->ltag==0&&child->rtag==0)//孩子結(jié)點左右孩子都有</p><p><b>  {</b></p><p>  ThrNode<T>*q;</p><p>  F->

65、lchild=child->lchild;//將child左孩子上提</p><p>  s=child->rchild;</p><p>  while(s->lchild)//查找child右孩子的最左下結(jié)點</p><p>  s=s->lchild;</p><p>  s->lchild=child-&

66、gt;lchild->rchild;//若child->lchild右子樹非空,把child左孩子的右子樹接到右子樹的最左下結(jié)點</p><p>  if(child->lchild->rtag==0)//child->lchild右子樹非空</p><p>  s->ltag=0;</p><p>  q=child->l

67、child;</p><p>  while(q->rchild!=NULL)</p><p>  q=q->rchild;</p><p>  q->rchild=s;//把q的后繼指到s上</p><p>  child->lchild->rchild=child->rchild;//設(shè)置child左孩

68、子的右子樹</p><p>  child->lchild->rtag=0; </p><p><b>  }</b></p><p><b>  }</b></p><p>  if(child==F->rchild||child==F)//是父親結(jié)點的右孩子</p>

69、;<p><b>  {</b></p><p>  if(child->ltag==1&&child->rtag==1)//孩子結(jié)點沒有左右孩子</p><p><b>  {</b></p><p>  F->rchild=child->rchild;//child

70、的后繼為空</p><p>  F->rtag=1;</p><p><b>  }</b></p><p>  else if(child->ltag==0&&child->rtag==1)//孩子結(jié)點有左孩子,無右孩子</p><p><b>  {</b>&l

71、t;/p><p>  F->rchild=child->lchild;//將孩子結(jié)點的右孩子向上提</p><p>  s=child->lchild;</p><p>  while(s->rchild)//查找孩子結(jié)點左子樹的最右結(jié)點</p><p>  s=s->rchild;</p><p

72、>  s->rchild=child->rchild;//后繼化</p><p><b>  }</b></p><p>  else if(child->ltag==1&&child->rtag==0)//孩子結(jié)點有右孩子無左孩子</p><p><b>  {</b>

73、</p><p>  F->rchild=child->rchild;//將孩子結(jié)點的右孩子向上提</p><p>  s=child->rchild;</p><p>  while(s->lchild)//查找孩子結(jié)點右子樹的最左結(jié)點</p><p>  s=s->lchild;</p><

74、;p>  s->lchild=F;//前驅(qū)化</p><p><b>  }</b></p><p>  else if(child->ltag==0&&child->rtag==0)//孩子結(jié)點既有左孩子又有右孩子</p><p><b>  {</b></p>&l

75、t;p>  ThrNode<T>*q;</p><p>  F->rchild=child->rchild;//將child右孩子上提</p><p>  s=child->lchild;</p><p>  while(s->rchild)//查找child左孩子的最右下結(jié)點</p><p>  s

76、=s->rchild;</p><p>  s->rchild=child->rchild->lchild;//若child->rchild右子樹非空,把child右孩子的左子樹接到左子樹的最右下結(jié)點</p><p>  if(child->rchild->ltag==0)//child->rchild的左子樹非空</p>&l

77、t;p>  s->rtag=0;</p><p>  q=child->rchild;</p><p>  while(q->lchild!=NULL)</p><p>  q=q->lchild;</p><p>  q->lchild=s;//把q的后繼指到s上</p><p>

78、  child->rchild->lchild=child->lchild;//設(shè)置child右孩子的左子樹</p><p>  child->rchild->ltag=0; </p><p><b>  }</b></p><p><b>  }</b></p><p&

79、gt;<b>  } </b></p><p>  3.6查找前驅(qū)后繼函數(shù)</p><p>  前驅(qū)和后繼就是某個結(jié)點左右指針指向的結(jié)點,查找前驅(qū)和后繼與二叉樹線索化得次序有關(guān)。</p><p>  template<class T></p><p>  ThrNode<T>*MyTre

80、e<T>::Former(ThrNode<T>*p)</p><p><b>  {</b></p><p>  ThrNode<T> *q;//p為待查找結(jié)點,q為p的前驅(qū)</p><p>  if(p==0)return 0;</p><p><b>  q=0;<

81、/b></p><p>  if(p->ltag==1)</p><p>  q=p->lchild; //左標(biāo)志為,可直接得到前驅(qū)結(jié)點</p><p><b>  else</b></p><p><b>  {</b></p><p>  q=p-&

82、gt;lchild; //工作指針q指向結(jié)點p的左孩子</p><p>  while(q->rtag==0)</p><p>  q=q->rchild; //查找最右下結(jié)點</p><p><b>  }</b></p><p><b>  return q;</b></

83、p><p><b>  }</b></p><p>  template<class T></p><p>  ThrNode<T>*MyTree<T>::Next(ThrNode<T>*p)</p><p><b>  {</b></p>

84、<p>  ThrNode<T> *q;//p為待查找結(jié)點,q為p的后繼</p><p>  if(p==0) return 0;</p><p><b>  q=0;</b></p><p>  if(p->rtag==1)</p><p>  q=p->rchild; //右標(biāo)

85、志為,可直接得到后繼結(jié)點</p><p><b>  else</b></p><p><b>  {</b></p><p>  q=p->rchild; //工作指針q指向結(jié)點p的右孩子</p><p>  while(q->ltag==0)</p><p&g

86、t;  q=q->lchild; //查找最左下結(jié)點</p><p><b>  }</b></p><p><b>  return q;</b></p><p><b>  }</b></p><p><b>  4 調(diào)試分析</b></

87、p><p>  在上面給出測試的所有數(shù)據(jù),按照上面的數(shù)據(jù)錄入即可。</p><p>  問題:在測試過程中沒有給測試者提供相關(guān)的錄入信息要求,導(dǎo)致錄入要求不合格,程序不能正常運行。</p><p>  解決方法:經(jīng)過添加錄入信息提示可解決這個問題。</p><p><b>  5 用戶使用說明</b></p>

88、<p>  直接按照菜單上面的提示從鍵盤上錄入數(shù)據(jù)即可,不需要過多的操作。該軟件操作界面簡潔美觀,操作簡單,適合用戶使用。</p><p><b>  6 測試結(jié)果</b></p><p><b>  6.1新建二叉樹</b></p><p>  圖6-1 構(gòu)建二叉樹</p><p>&l

89、t;b>  6.2中序遍歷</b></p><p><b>  圖6-2中序遍歷</b></p><p><b>  6.3查找前驅(qū)</b></p><p>  圖6-3 查找指定結(jié)點的前驅(qū)</p><p><b>  6.4查找后繼</b></p>

90、;<p>  圖6-4 查找指定結(jié)點的后繼</p><p><b>  6.5刪除結(jié)點</b></p><p>  圖6-5 刪除一個結(jié)點</p><p><b>  6.6插入左孩子</b></p><p>  圖6-6 在左子樹插入一個結(jié)點</p><p>

91、;<b>  6.7插入右孩子</b></p><p>  圖6-7 在右子樹插入一個結(jié)點</p><p><b>  6.8退出</b></p><p><b>  圖6-8 退出系統(tǒng)</b></p><p><b>  結(jié) 論 </b></p

92、><p>  本次課程設(shè)計“線索二叉樹的基本操作”按照任務(wù)書相應(yīng)的要求成功的完成了任務(wù),由于本課程設(shè)計涉及中序的線索化以及相應(yīng)的相關(guān)插入刪除等操作,因此對算法的設(shè)計以及相關(guān)函數(shù)的調(diào)用要求很高,需要通過反復(fù)的查看相關(guān)書籍才能完成。</p><p>  當(dāng)我開始編寫這個題目的代碼的時候,我覺得難度相當(dāng)?shù)拇?。成天的抱怨我怎么選這么難的題目。在我寫完所有代碼的時候,我發(fā)現(xiàn)問題太多了。最開始連一棵樹都不

93、能構(gòu)造出來程序就停止工作,然后經(jīng)過一歩一步的調(diào)試,終于改對了,卻發(fā)現(xiàn)每個功能函數(shù)都不能實現(xiàn),都存在各種各樣的問題。很多時候不知道怎么改,而且老師同學(xué)一時半會兒也講不清楚,因為他們不知道我的程序具體是怎樣寫的。只有幫我調(diào)試,然后慢慢糾錯。即使這樣,好多問題依然沒有得到解決。頓時,心情變得極為糟糕,曾有過放棄的念頭。但是,看見別的同學(xué)都能耐心的做,而且我害怕掛科,所以我只能繼續(xù)耐心的做下去。還好皇天不負(fù)苦心人,終于讓我的付出有了收獲。<

94、;/p><p>  我覺得編程邏輯思維很重要,在實現(xiàn)每一個功能的時候,要先想清楚具體怎么做,然后再編寫代碼。在編程的時候應(yīng)該每編寫出一個功能,要待其實現(xiàn)后再去編寫下一個功能。不能把所有功能函數(shù)全部寫出來再來慢慢改錯、糾正,這樣會浪費更多的時間。</p><p>  通過這次課程設(shè)計,我學(xué)會了自己主動去學(xué)習(xí)一些東西,而且也漸漸明白了數(shù)據(jù)結(jié)構(gòu)這門課的實用性,雖然我覺得有的地方很難,需要向老師同學(xué)請

95、教,但也慢慢對軟件工程產(chǎn)生了興趣。</p><p><b>  致 謝 </b></p><p>  在這次課程設(shè)計過程中,首先感謝輔導(dǎo)老師對我的指導(dǎo);同時也感謝耐心幫助我的同學(xué)。我也感謝自己,感謝自己沒有放棄,感謝中堅持到了最后;感謝這次數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計,我學(xué)到了很多,感謝這次實訓(xùn)。</p><p><b>  參考文獻(xiàn) &

96、lt;/b></p><p>  [1] 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu).清華大學(xué)出版社出版。 </p><p>  [2] 嚴(yán)蔚敏,吳偉民. 數(shù)據(jù)結(jié)構(gòu)題集(C語言版) .清華大學(xué)出版社.2003年5月。</p><p>  [3]唐策善,李龍澎.數(shù)據(jù)結(jié)構(gòu)(作C語言描述) .高等教育出版社.2001年9月</p><p>  [4] 朱戰(zhàn)立

97、.數(shù)據(jù)結(jié)構(gòu)(C++語言描述)(第二版本).高等出版社出版.2004年4月。</p><p>  [5]胡學(xué)鋼.數(shù)據(jù)結(jié)構(gòu)(C語言版) .高等教育出版社.2004年8月。</p><p>  [6]陳明編著.數(shù)據(jù)結(jié)構(gòu).北京:清華大學(xué)出版社,2005年。</p><p>  [7]王紅梅,胡明,王濤編著(C++版)(第2版).清華大學(xué)出版社.2011年6月</p&g

溫馨提示

  • 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

提交評論