二叉樹基本操作課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  學(xué)年論文(設(shè)計(jì))</b></p><p><b> ?。ū究疲?lt;/b></p><p>  學(xué) 院 </p><p>  專 業(yè) </p><p>  年 級

2、 </p><p>  姓 名 </p><p>  論文(設(shè)計(jì))題目 </p><p>  指導(dǎo)教師 職稱 </p><p>  成 績

3、 </p><p>  2012 年 月 日</p><p><b>  摘要:</b></p><p>  數(shù)據(jù)結(jié)構(gòu)是一門研究非數(shù)值計(jì)算的程序設(shè)計(jì)問題中計(jì)算機(jī)的操作對象以及它們之間的關(guān)系和操作的學(xué)科。作為研究對象的數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)中的表示(又稱映像),稱為數(shù)據(jù)的

4、物理結(jié)構(gòu),又稱存儲(chǔ)結(jié)構(gòu)。相同的邏輯結(jié)構(gòu)可以具有不同的存儲(chǔ)結(jié)構(gòu),因而有不同的算法。</p><p>  本次課程設(shè)計(jì),程序中的數(shù)據(jù)采用“樹形結(jié)構(gòu)”作為其數(shù)據(jù)結(jié)構(gòu)。具體采用的是二叉樹。二叉樹是樹形結(jié)構(gòu)的一個(gè)重要的類型,二叉樹是n(n>0)個(gè)結(jié)點(diǎn)的有限集,它或者是空集(n>0),或者由一個(gè)根結(jié)點(diǎn)以及兩棵互不相交的,分別稱為左子樹和右子樹的二叉樹組成。</p><p>  二叉樹的順序

5、存儲(chǔ)結(jié)構(gòu)是把二叉樹所有結(jié)點(diǎn),按照一定的次序排序,存儲(chǔ)到一片連續(xù)的存儲(chǔ)單元中。但二叉樹的順序存儲(chǔ)結(jié)構(gòu)浪費(fèi)空間并且插入、刪除不方便。二叉樹的鏈?zhǔn)酱鎯?chǔ)每個(gè)結(jié)點(diǎn)至少包含三個(gè)域:數(shù)據(jù)域、左指針域、右指針域,不浪費(fèi)空間。二叉樹的存儲(chǔ)結(jié)構(gòu)和算法比較簡單,特別適合計(jì)算機(jī)處理,即使一般形式的樹也可簡單的轉(zhuǎn)換為二叉樹。</p><p>  現(xiàn)實(shí)中經(jīng)常用到二叉樹,因此本課程設(shè)計(jì)主要實(shí)現(xiàn)了二叉樹的建立、三種遍歷,計(jì)算二叉數(shù)的樹深、統(tǒng)計(jì)葉

6、子結(jié)點(diǎn)的個(gè)數(shù)等功能。</p><p>  關(guān)鍵詞:二叉樹;遍歷;樹深;葉子結(jié)點(diǎn)</p><p><b>  學(xué)生簽名: </b></p><p>  2012年 月 日</p><p><b>  目錄</b></p><p><b>  一、需求分析

7、4</b></p><p><b>  二、概要設(shè)計(jì)5</b></p><p><b>  三、詳細(xì)設(shè)計(jì)6</b></p><p>  四、調(diào)試分析及測試12</p><p>  五、課程設(shè)計(jì)總結(jié)20</p><p><b>  參考文獻(xiàn)21

8、</b></p><p><b>  附錄21</b></p><p><b>  二叉樹基本操作</b></p><p><b>  需求分析</b></p><p>  二叉樹形象地說即樹中每個(gè)節(jié)點(diǎn)最多只有兩個(gè)分支,它是一種重要的數(shù)據(jù)類型。可以運(yùn)用于建立家譜,

9、公司所有的員工的職位圖,以及各種事物的分類和各種機(jī)構(gòu)的職位圖表等。</p><p>  二叉樹是通過建立一個(gè)鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),達(dá)到能夠?qū)崿F(xiàn)前序遍歷,中序遍歷,后序遍歷。以及能夠從輸入的數(shù)據(jù)中得知二叉樹的葉子結(jié)點(diǎn)的個(gè)數(shù),二叉樹的深度。在此,二叉樹的每一個(gè)結(jié)點(diǎn)中必須包括:值域,左指針域,右指針域。演示程序以用戶與計(jì)算機(jī)對話的方式進(jìn)行,即在計(jì)算機(jī)終端上顯示提示信息后,由用戶在鍵盤上輸入相應(yīng)動(dòng)作的序號和相應(yīng)的輸入數(shù)據(jù)。<

10、;/p><p><b>  1.1 選題理由</b></p><p>  根據(jù)自己的知識功底和能力水平擇選了二叉樹問題. 而且隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,越來越多的問題正逐漸改用計(jì)算機(jī)解答,并且有些技術(shù)已經(jīng)非常成熟。運(yùn)用所學(xué)計(jì)算機(jī)知識來研究二叉樹的有關(guān)內(nèi)容可以鍛煉和提高我編程 和獨(dú)立解決問題的能力,還可以使我增強(qiáng)信心,為我以后的編程開個(gè)好頭,故我選擇了這個(gè)課題。</p

11、><p>  1.2課程設(shè)計(jì)任務(wù)及要求</p><p>  (1)按先序次序輸入二叉樹中結(jié)點(diǎn)的值,構(gòu)造二叉鏈表表示的二叉樹t;</p><p>  (2)對二叉樹t作先序、中序、后序遍歷的遞歸算法,輸出結(jié)果;</p><p>  (3)計(jì)算二叉樹t的深度,輸出結(jié)果;</p><p>  (4)計(jì)算二叉樹t的葉子結(jié)點(diǎn)個(gè)數(shù)&l

12、t;/p><p><b>  1.3課程設(shè)計(jì)思想</b></p><p>  本次課程設(shè)計(jì)中,用到的主要知識就是遞歸思想,著重體會(huì)遞歸的思想。建立二叉樹采用先序次序插入的方式。對二叉樹進(jìn)行遍歷時(shí)采用遞歸函數(shù)的方式。求二叉樹的深度及葉子結(jié)點(diǎn)個(gè)數(shù)均采用遞歸方式。 </p><p>  1.4軟硬件運(yùn)行環(huán)境及開發(fā)工具</p><p&g

13、t;  WindowsXP操作系統(tǒng)、Microsoft Visual C++ 6.0</p><p><b>  概要設(shè)計(jì)</b></p><p>  2.1對程序中定義的核心數(shù)據(jù)結(jié)構(gòu)及對其說明:</p><p>  typedef struct BiTNode</p><p><b>  { </

14、b></p><p>  char data;</p><p>  struct BiTNode *lchild,*rchild;</p><p>  }BiTNode,*BiTree;</p><p>  在開頭定義了二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),此處采用了每個(gè)結(jié)點(diǎn)中設(shè)置三個(gè)域, 即值域,左指針域和右指針域。</p><p

15、>  2.2 程序模塊及其功能:</p><p>  本程序分為:7大模塊。二叉樹的建立鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)、前序遍歷、中序遍歷、后序遍歷、求葉子結(jié)點(diǎn)的個(gè)數(shù)計(jì)算、中序遍歷、后序遍歷、深度、主函數(shù)。</p><p>  1、二叉樹的建立鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu);首先typedef struct BiTNode:定義二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),此處采用了每個(gè)結(jié)點(diǎn)中設(shè)置三個(gè)域,data:即值域,*lchild:左指

16、針域和rchild:右指針域。</p><p>  2、二叉樹的前序遍歷;利用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)的前序遍歷:先訪問根結(jié)點(diǎn),再依次訪問左右子樹。</p><p>  3、二叉樹的中序遍歷;利用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)的中序遍歷:先訪問左子數(shù),再訪問根結(jié)點(diǎn),最后訪問右子樹。</p><p>  4、二叉樹的后序遍歷;利用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)的前序遍歷:先訪問左右子樹,再訪

17、問根結(jié)點(diǎn)。</p><p>  5、求二叉樹的深度:首先判斷二叉樹是否為空,若為空則此二叉樹的深度為0。否則,就先別求出左右子樹的深度并進(jìn)行比較,取較大的+1就為二叉樹的深度。</p><p>  6、二叉樹的求葉子結(jié)點(diǎn)的個(gè)數(shù)計(jì)算;先分別求得左右子樹中各葉子結(jié)點(diǎn)個(gè)數(shù),再計(jì)算出兩者之和即為二叉樹的葉子結(jié)點(diǎn)數(shù)。</p><p>  7、主函數(shù)。主函數(shù)中分別調(diào)用各函數(shù)。&

18、lt;/p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p>  1、存儲(chǔ)結(jié)構(gòu)的建立由遞歸函數(shù)實(shí)現(xiàn)</p><p><b>  具體函數(shù)為:</b></p><p>  typedef struct bitnode</p><p><b>  {</b>

19、</p><p>  telemtype data;</p><p>  struct bitnode *lchild,*rchild;</p><p>  }bitnode ,*bitree;</p><p>  bitree createbitree(bitree t)</p><p><b>  {&l

20、t;/b></p><p><b>  char ch;</b></p><p>  scanf("%c",&ch);</p><p>  if(ch=='#') t=NULL;</p><p><b>  else</b></p>&

21、lt;p><b>  {</b></p><p>  if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p>  t->data=ch;</p><p>  t->lchild=createbitree(t->lchild);</p&g

22、t;<p>  t->rchild=createbitree(t->rchild);</p><p><b>  }</b></p><p><b>  return t;</b></p><p><b>  }</b></p><p>  在創(chuàng)建的二

23、叉樹中,左右孩子都為字符型。</p><p>  char的作用是輸入n個(gè)任意的字符,而且在輸入n個(gè)字符后,必須輸入n+1個(gè)'#',才能得到本程序所有能夠?qū)崿F(xiàn)的功能。t=Null是將二叉樹置空。</p><p>  if(!(t=(bitnode *)malloc(sizeof(bitnode)))),采用動(dòng)態(tài)申請新結(jié)點(diǎn)的方式,不僅實(shí)現(xiàn)起來方便,而且還節(jié)省大量的存儲(chǔ)空間。&

24、lt;/p><p>  t->data=ch;值域</p><p>  t->lchild=createbitree(t->lchild);</p><p>  t->rchild=createbitree(t->rchild);</p><p>  將二叉樹中的每一個(gè)結(jié)點(diǎn)設(shè)置為:值域,左指針域,右指針。</p

25、><p>  這一小段程序?qū)崿F(xiàn)了二叉樹的置空,二叉樹的建立,二叉樹的存儲(chǔ)。</p><p>  2、前序遍歷:先訪問根結(jié)點(diǎn),再訪問左子樹,最后訪問右子樹。</p><p><b>  具體函數(shù)為:</b></p><p>  void preordertraverse(bitree t)</p><p&g

26、t;<b>  {</b></p><p><b>  if(t)</b></p><p><b>  {</b></p><p>  printf("%c",t->data);</p><p>  preordertraverse(t->lch

27、ild);</p><p>  preordertraverse(t->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  3、中序遍歷:先訪問左子樹,再訪問根結(jié)點(diǎn),最后訪問右子樹。</p><p>&l

28、t;b>  具體函數(shù)為:</b></p><p>  void inordertraverse(bitree t)</p><p><b>  {</b></p><p><b>  if (t)</b></p><p><b>  {</b></p&g

29、t;<p>  inordertraverse(t->lchild);</p><p>  printf("%c",t->data);</p><p>  inordertraverse(t->rchild);</p><p><b>  }</b></p><p>&

30、lt;b>  }</b></p><p>  4、后序遍歷:先訪問左子樹,再訪問右子樹,最后訪問根結(jié)點(diǎn)。</p><p><b>  具體函數(shù)為:</b></p><p>  void postordertraverse(bitree t)</p><p><b>  {</b>&

31、lt;/p><p><b>  if(t)</b></p><p><b>  {</b></p><p>  postordertraverse(t->lchild);</p><p>  postordertraverse(t->rchild);</p><p>

32、  printf("%c",t->data);</p><p><b>  }</b></p><p><b>  }</b></p><p>  5、求二叉樹的深度:</p><p>  先定義三個(gè)整形變量m,n.如果樹為空,則height=0;</p>&

33、lt;p>  否則,先分別訪問出左右子樹的深度,再進(jìn)行比較,將較大的+1的結(jié)果就是所求二叉樹的深度。</p><p><b>  具體函數(shù)為:</b></p><p>  int height(bitree t)</p><p><b>  {</b></p><p><b>  i

34、nt m,n;</b></p><p>  if(t==NULL) return 0;</p><p><b>  else </b></p><p><b>  {</b></p><p>  m=height(t->lchild);</p><p>  

35、n=height(t->rchild);</p><p>  return (m>n)?m+1:n+1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  6、求葉子結(jié)點(diǎn)的個(gè)數(shù):</p><p>  用leafco

36、unt變量表示葉子結(jié)點(diǎn)的總個(gè)數(shù),用leafcount(t->lchild)、leafcount(t->rchild)分別表示訪問的左右子樹中葉子結(jié)點(diǎn)的個(gè)數(shù)。</p><p>  當(dāng)樹為空是此時(shí)討論葉子結(jié)點(diǎn)個(gè)數(shù)無意義;</p><p><b>  當(dāng)樹非空時(shí)分為:</b></p><p>  一、左右子數(shù)都不存在時(shí),即葉子結(jié)點(diǎn)的個(gè)數(shù)為

37、1;</p><p>  二、左右子樹存在,就用分別訪問出左右子樹中葉子結(jié)點(diǎn)的個(gè)數(shù),兩者相加就為二叉樹葉子結(jié)點(diǎn)的個(gè)數(shù)。</p><p><b>  具體函數(shù)為:</b></p><p>  int leafcount(bitree t)</p><p><b>  {</b></p>

38、<p>  if(!t) return 0; //空數(shù)無葉子</p><p>  else if(!t->lchild&&!t->rchild) return 1;</p><p>  else return leafcount(t->lchild)+leafcount(t->rchild);</p><p>

39、<b>  }</b></p><p><b>  7、主函數(shù):</b></p><p>  包括:二叉樹的數(shù)據(jù)結(jié)構(gòu)bitree t、函數(shù)createbitree、height、leafcount、前序遍歷preordertraverse、中序遍歷inordertraverse、后序遍歷postordertraverse。</p>

40、<p><b>  具體函數(shù)為:</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  bitree t;</b></p><p><b>  int w,v;</b></p

41、><p>  printf("請輸入建樹字符序列:");</p><p>  t=createbitree(t);</p><p>  printf("先續(xù)遍歷的結(jié)果是:");</p><p>  preordertraverse(t);</p><p>  printf("

42、;\n");</p><p>  printf("中續(xù)遍歷的結(jié)果是:");</p><p>  inordertraverse(t);</p><p>  printf("\n");</p><p>  printf("后續(xù)遍歷的結(jié)果是:");</p><

43、;p>  postordertraverse(t);</p><p>  printf("\n");</p><p>  printf("二叉樹的深度是:");</p><p>  w=height(t);</p><p>  printf("%d\n",w);</p&g

44、t;<p>  printf("二叉樹的葉子結(jié)點(diǎn)的數(shù)目為:");</p><p>  v=leafcount(t);</p><p>  printf("%d",v);</p><p>  printf("\n");</p><p><b>  }</b

45、></p><p><b>  8、完整代碼:</b></p><p>  #include <stdio.h></p><p>  #include <malloc.h></p><p>  #include <process.h></p><p>  

46、#define ok 1</p><p>  #define error 0</p><p>  #define overflow -1</p><p>  typedef char telemtype;</p><p>  typedef struct bitnode</p><p><b>  {<

47、/b></p><p>  telemtype data;</p><p>  struct bitnode *lchild,*rchild;</p><p>  }bitnode ,*bitree;</p><p>  bitree createbitree(bitree t)</p><p><b>

48、;  {</b></p><p><b>  char ch;</b></p><p>  scanf("%c",&ch);</p><p>  if(ch=='#') t=NULL;</p><p><b>  else</b></p&

49、gt;<p><b>  {</b></p><p>  if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p>  t->data=ch;</p><p>  t->lchild=createbitree(t->lchild);&l

50、t;/p><p>  t->rchild=createbitree(t->rchild);</p><p><b>  }</b></p><p><b>  return t;</b></p><p><b>  }</b></p><p> 

51、 void preordertraverse(bitree t)</p><p><b>  {</b></p><p><b>  if(t)</b></p><p><b>  {</b></p><p>  printf("%c",t->data

52、);</p><p>  preordertraverse(t->lchild);</p><p>  preordertraverse(t->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  v

53、oid inordertraverse(bitree t)</p><p><b>  {</b></p><p><b>  if (t)</b></p><p><b>  {</b></p><p>  inordertraverse(t->lchild);<

54、/p><p>  printf("%c",t->data);</p><p>  inordertraverse(t->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void

55、postordertraverse(bitree t)</p><p><b>  {</b></p><p><b>  if(t)</b></p><p><b>  {</b></p><p>  postordertraverse(t->lchild);</

56、p><p>  postordertraverse(t->rchild);</p><p>  printf("%c",t->data);</p><p><b>  }</b></p><p><b>  }</b></p><p>  int

57、height(bitree t)</p><p><b>  {</b></p><p><b>  int m,n;</b></p><p>  if(t==NULL) return 0;</p><p><b>  else </b></p><p>

58、;<b>  {</b></p><p>  m=height(t->lchild);</p><p>  n=height(t->rchild);</p><p>  return (m>n)?m+1:n+1;</p><p><b>  }</b></p><

59、;p><b>  }</b></p><p>  int leafcount(bitree t)</p><p><b>  {</b></p><p>  if(!t) return 0; //空數(shù)無葉子</p><p>  else if(!t->lchild&&

60、!t->rchild) return 1;</p><p>  else return leafcount(t->lchild)+leafcount(t->rchild);</p><p><b>  }</b></p><p>  void main()</p><p><b>  {&l

61、t;/b></p><p><b>  bitree t;</b></p><p><b>  int w,v;</b></p><p>  printf("請輸入建樹字符序列:");</p><p>  t=createbitree(t);</p><

62、p>  printf("先續(xù)遍歷的結(jié)果是:");</p><p>  preordertraverse(t);</p><p>  printf("\n");</p><p>  printf("中續(xù)遍歷的結(jié)果是:");</p><p>  inordertraverse(t)

63、;</p><p>  printf("\n");</p><p>  printf("后續(xù)遍歷的結(jié)果是:");</p><p>  postordertraverse(t);</p><p>  printf("\n");</p><p>  printf(

64、"二叉樹的深度是:");</p><p>  w=height(t);</p><p>  printf("%d\n",w);</p><p>  printf("二叉樹的葉子結(jié)點(diǎn)的數(shù)目為:");</p><p>  v=leafcount(t);</p><p&

65、gt;  printf("%d",v);</p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  調(diào)試分析及測試</b></p><p>  4.1 遇到的問題及解決方法</p><

66、;p>  (1). 二叉樹是另一種樹形結(jié)構(gòu),作為一種數(shù)據(jù)結(jié)構(gòu)其在計(jì)算機(jī)中的存儲(chǔ)結(jié)構(gòu)有兩種:順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。編寫代碼之前首先要確定采用的存儲(chǔ)方式。經(jīng)分析及查找參考資料決定采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),這種存儲(chǔ)結(jié)構(gòu)不浪費(fèi)空間并且插入、刪除方便。</p><p>  (2).本程序演示程序以用戶與計(jì)算機(jī)對話的方式進(jìn)行,即在計(jì)算機(jī)終端上顯示提示信息后,由用戶在鍵盤上輸入相應(yīng)動(dòng)作的序號和相應(yīng)的輸入數(shù)據(jù)。在運(yùn)行程序的過

67、程中出現(xiàn)錯(cuò)誤,出現(xiàn)了以下界面:</p><p>  后經(jīng)仔細(xì)分析及查看代碼,發(fā)現(xiàn)scanf("%c",&ch)語句中少了一個(gè)‘&’,經(jīng)改正后,再次運(yùn)行,得到結(jié)果。</p><p>  4.2 算法的時(shí)空分析</p><p>  遍歷二叉樹的基本操作是訪問結(jié)點(diǎn),則不論按哪一種次序進(jìn)行遍歷,對含n個(gè)結(jié)點(diǎn)的二叉樹,時(shí)間復(fù)雜度均為O(n)

68、。所需輔助空間為遍歷過程中棧的最大容量,即樹的深度,在最差情況下為n,則空間復(fù)雜度也為O(n)。</p><p>  4.3 程序模塊構(gòu)架</p><p>  本程序模塊劃分比較合理,易觀察且操作方便。整體可以分成七個(gè)模塊,分別為建立二叉樹、前序遍歷、中序遍歷、后序遍歷、求葉子結(jié)點(diǎn)的個(gè)數(shù)、求二叉樹的深度、主函數(shù)。</p><p><b>  4.4 算法的

69、改進(jìn)</b></p><p>  這道題可以用非遞歸也可以用遞歸的方法來編寫前序遍歷、中序遍歷、后序遍歷、求葉子結(jié)點(diǎn)的個(gè)數(shù)、求二叉樹深度的算法,這里我用了后者,遞歸算法簡單方便。</p><p>  4.5 程序使用說明</p><p>  (1) 本程序的運(yùn)行環(huán)境為WindowsXP操作系統(tǒng)</p><p> ?。?) 用戶界面

70、為Microsoft Visual C++ 6.0</p><p> ?。?) 進(jìn)入界面后,首先進(jìn)行代碼的輸入,然后通過編譯、組建、執(zhí)行,得到運(yùn)行結(jié)果,并進(jìn)行分析查看運(yùn)行結(jié)果是否正確,進(jìn)而確定是否要調(diào)試程序</p><p><b>  4.6 測試結(jié)果</b></p><p><b>  4.7 其他程序</b></

71、p><p>  (1) 遍歷二叉樹的另一種遞歸算法(以先序遍歷為例)</p><p>  #include <stdio.h></p><p>  #include <malloc.h></p><p>  #include <process.h></p><p>  #define

72、ok 1</p><p>  #define error 0</p><p>  #define overflow -1</p><p>  typedef char status;</p><p>  typedef char TElemtype;</p><p>  typedef st

73、ruct BiTNode</p><p><b>  {</b></p><p>  TElemtype data;</p><p>  struct BiTNode *lchild,*rchild;</p><p>  }BiTNode,*BiTree;</p><p>  sta

74、tus CreateBiTree(BiTree &T)</p><p>  { //按先序次序輸入二叉樹中結(jié)點(diǎn)的值(一個(gè)字符),'#'字符表示空樹,</p><p>  //構(gòu)造二叉鏈表表示的二叉樹T</p><p><b>  char ch;</b></p><p>  scanf(&qu

75、ot;%c",&ch);</p><p>  if (ch=='#') T=NULL;</p><p><b>  else </b></p><p><b>  {</b></p><p>  if(!(T=(BiTNode *)malloc(sizeof(BiT

76、Node)))) </p><p>  exit (overflow);</p><p>  T->data=ch; //生成根結(jié)點(diǎn)</p><p>  CreateBiTree(T->lchild); //構(gòu)造左子數(shù)</p><p>  CreateBiTree(T->rchi

77、ld); //構(gòu)造右子數(shù)</p><p><b>  }</b></p><p>  return ok;</p><p><b>  }</b></p><p>  status PreorderTraverse(BiTree T,status(*visit)(TElemtype e))&l

78、t;/p><p>  { //采用二叉鏈表存儲(chǔ)結(jié)構(gòu),visit是對數(shù)據(jù)元素操作的應(yīng)用函數(shù),</p><p>  //先序遍歷二叉樹T的遞歸算法,對每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit</p><p><b>  if (T)</b></p><p><b>  {</b></p><p

79、>  if(visit(T->data))</p><p>  if(PreorderTraverse(T->lchild,visit))</p><p>  if(PreorderTraverse(T->rchild,visit)) return ok;</p><p>  return error;</p><p>

80、;<b>  }</b></p><p>  else return ok;</p><p><b>  }</b></p><p>  status printelement(TElemtype e)</p><p><b>  {</b></p><p

81、>  printf("%c",e);</p><p>  return ok;</p><p><b>  }</b></p><p>  void main ()</p><p><b>  { </b></p><p><b>  Bi

82、Tree T;</b></p><p>  CreateBiTree(T);</p><p>  PreorderTraverse(T,printelement);</p><p><b>  }</b></p><p><b>  運(yùn)行結(jié)果為</b></p><p&

83、gt; ?。?) 求二叉樹中以元素值為x的結(jié)點(diǎn)為根的子樹的深度</p><p>  #include <stdio.h></p><p>  #include <malloc.h></p><p>  #include <process.h></p><p>  #define ok 1</p>

84、;<p>  #define error 0</p><p>  #define overflow -1</p><p>  typedef char status;</p><p>  typedef char telemtype;</p><p>  typedef struct bitnode</p>

85、<p><b>  {</b></p><p>  telemtype data;</p><p>  struct bitnode *lchild,*rchild;</p><p>  }bitnode,*bitree;</p><p>  status createbitree(bitree &am

86、p;t)</p><p><b>  {</b></p><p><b>  char ch;</b></p><p>  scanf("%c",&ch);</p><p>  if(ch=='#') t=NULL;</p><p&g

87、t;<b>  else</b></p><p><b>  {</b></p><p>  if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p>  t->data=ch;</p><p>  createb

88、itree(t->lchild);</p><p>  createbitree(t->rchild);</p><p><b>  }</b></p><p>  return ok;</p><p><b>  }</b></p><p>  int getd

89、epth(bitree t)</p><p><b>  {</b></p><p><b>  int m,n;</b></p><p><b>  if(t)</b></p><p><b>  {</b></p><p>  

90、m=getdepth(t->lchild);</p><p>  n=getdepth(t->rchild);</p><p>  return m>=n?m+1:n+1;</p><p><b>  }</b></p><p>  else return 0;</p><p>

91、<b>  }</b></p><p>  int depthx(bitree t,char x)</p><p><b>  {</b></p><p><b>  int m,n;</b></p><p><b>  if(t)</b></p&g

92、t;<p><b>  {</b></p><p>  if(t->data==x) return getdepth(t);</p><p><b>  else</b></p><p><b>  {</b></p><p>  m=depthx(t-&g

93、t;lchild,x);</p><p>  n=depthx(t->rchild,x);</p><p>  return m>=n?m:n;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else retu

94、rn 0;</p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  bitree t;</b></p><p><b>  int w,v;<

95、/b></p><p><b>  char x;</b></p><p>  printf("請輸入以建立二叉樹:");</p><p>  createbitree(t);</p><p>  printf("二叉樹的深度是:");</p><p>

96、;  w=getdepth(t);</p><p>  printf("%d\n",w);</p><p>  scanf("%c",&x);</p><p>  printf("請輸入x:");</p><p>  scanf("%c",&x);

97、</p><p>  v=depthx(t,x);</p><p>  printf("二叉樹中以元素值為x的結(jié)點(diǎn)為根的子樹的深度是:");</p><p>  printf("%d\n",v);</p><p><b>  }</b></p><p>&l

98、t;b>  運(yùn)行結(jié)果為</b></p><p> ?。?) 求二叉樹的葉子節(jié)點(diǎn)個(gè)#include <stdio.h></p><p>  #include <malloc.h></p><p>  #include <process.h></p><p>  #define ok 1&l

99、t;/p><p>  #define error 0</p><p>  #define overflow -1</p><p>  typedef char status;</p><p>  typedef char telemtype;</p><p>  typedef struct bitnode<

100、;/p><p><b>  {</b></p><p>  telemtype data;</p><p>  struct bitnode *lchild,*rchild;</p><p>  }bitnode,*bitree;</p><p>  status createbitree(bit

101、ree &t)</p><p><b>  {</b></p><p><b>  char ch;</b></p><p>  scanf("%c",&ch);</p><p>  if(ch=='#') t=NULL;</p>

102、<p><b>  else</b></p><p><b>  {</b></p><p>  if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p>  t->data=ch;</p><p>  

103、createbitree(t->lchild);</p><p>  createbitree(t->rchild);</p><p><b>  }</b></p><p>  return ok;</p><p><b>  }</b></p><p>  s

104、tatus POLeafNodeNum(int& i,bitree& t)</p><p><b>  {</b></p><p><b>  if(t)</b></p><p><b>  {</b></p><p>  if(!t->lchild &a

105、mp;& !t->rchild) i++;</p><p>  POLeafNodeNum(i,t->lchild);</p><p>  POLeafNodeNum(i,t->rchild);</p><p><b>  }</b></p><p><b>  return i;&l

106、t;/b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  bitree t;</b></p><p>  int i=0,w;</p&g

107、t;<p>  printf("請讀入字符建立二叉鏈表:\n");</p><p>  createbitree(t); </p><p>  printf("二叉樹的葉子結(jié)點(diǎn)的數(shù)目為:");</p><p>  w=POLeafNodeNum(i,t);</p><p>  printf

108、("%d",w);</p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  運(yùn)行結(jié)果為</b></p><p><b>  五、課程設(shè)計(jì)總結(jié)</b></p><

109、;p>  本程序基本上實(shí)現(xiàn)了前序遍歷,中序遍歷,后序遍歷,葉子結(jié)點(diǎn)個(gè)數(shù)的求出,二叉樹深度的求出等基本操作。 </p><p>  在本次課程設(shè)計(jì)的學(xué)習(xí)過程中,我在其中的最大的收獲,就是得到了許多的經(jīng)驗(yàn)以及軟件設(shè)計(jì)的一些新的思路。 </p><p>  邁著時(shí)間的步伐,這次的課程設(shè)計(jì)也即將結(jié)束,但這個(gè)學(xué)期數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)還是具有相當(dāng)大的意義,特別是這次的課程設(shè)計(jì),它從一個(gè)程度上改變了我的

110、編程思想,如何將一個(gè)程序快速而又準(zhǔn)備的進(jìn)行編寫,進(jìn)行編譯,都成為了我思考的重點(diǎn)。同時(shí)通過這一個(gè)學(xué)期的學(xué)習(xí),我們將數(shù)據(jù)結(jié)構(gòu)的思想帶入到了我們以后的編程學(xué)習(xí)中去。在這個(gè)階段,我也明白了,好的思想,不能提留于字面上的認(rèn)知,還需要平時(shí)多練多寫一些相關(guān)的程序,并且通過修改,加入新的算法去嘗試改變自己的一些編程思想。保持更新算法的速度,這才是關(guān)鍵。</p><p>  但在這次的課設(shè)中也遇了一些問題。做二叉樹之前,必須先構(gòu)思

111、出怎樣建立和想要實(shí)現(xiàn)那些功能。然后分塊去建立各自的模型。由于做好了這些工作,我的課程設(shè)計(jì)進(jìn)行的還比較順利。但是,也出現(xiàn)一些很基礎(chǔ)很低級的錯(cuò)誤,后來經(jīng)過自己的仔細(xì)分析,終于圓滿完成。這說明我的程序設(shè)計(jì)基礎(chǔ)還不是太扎實(shí),還需要多上機(jī)實(shí)現(xiàn),不能陷入只看不做的誤區(qū)。</p><p>  通過這次的課程設(shè)計(jì),我從中得到了許多經(jīng)驗(yàn)和軟件設(shè)計(jì)的一些新思路。從二叉樹問題設(shè)計(jì)以及分析中,我理解到了數(shù)據(jù)結(jié)構(gòu)對于軟件設(shè)計(jì)的重要性。它的

112、使用,可以改變軟件的運(yùn)行周期,思路從繁化簡,并且都能夠通過其相關(guān)引導(dǎo),將本身以前編程思想進(jìn)行擴(kuò)充,發(fā)展。這也是在這次課程設(shè)計(jì)中我所掌握得到的。</p><p>  二叉樹的基本操作是多種多樣的,由于水平有限,故不能做太大規(guī)模的設(shè)計(jì)。雖然程序規(guī)模不大,程序也都較基礎(chǔ),但我依然為此付出了努力,仍免不了各種錯(cuò)誤的出現(xiàn)。編程過程需要很大的毅力和耐心,而且要有良好的思維和扎實(shí)的專業(yè)基礎(chǔ)知識,所以我需要不斷努力的學(xué)習(xí),發(fā)現(xiàn)自

113、身不足之處并努力改正它,逐步提高自身的能力,不斷取得進(jìn)步。通過實(shí)踐,我認(rèn)識到知識運(yùn)用的重要性,并且努力加深對基礎(chǔ)知識的理解,從中了解自己需要學(xué)習(xí)的東西并學(xué)會(huì)自學(xué)。作為一名計(jì)算機(jī)專業(yè)的學(xué)生,今后我會(huì)加緊學(xué)習(xí),為將來打下堅(jiān)實(shí)的基礎(chǔ)。</p><p><b>  參考文獻(xiàn)</b></p><p>  嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)(C語言版).北京:清華大學(xué)出版社,2007<

114、;/p><p>  嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)題集(C語言版).北京:清華大學(xué)出版社,2007</p><p>  高一凡,《數(shù)據(jù)結(jié)構(gòu)》算法實(shí)現(xiàn)及解析.西安:西安電子科技大學(xué)出版社,2005 </p><p>  譚浩強(qiáng),C程序設(shè)計(jì)(第四版).北京:清華大學(xué)出版社,2010</p><p><b>  附錄 </b>&l

115、t;/p><p><b>  致謝</b></p><p>  在這次課程設(shè)計(jì)的撰寫過程中,我得到了許多人的幫助。</p><p>  首先我要感謝我的老師在課程設(shè)計(jì)上給予我的指導(dǎo)、提供給我的支持和幫助,本次課程設(shè)計(jì)是在王淑禮老師的悉心指導(dǎo)下完成的,老師淵博的知識,嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度,一絲不茍的工作作風(fēng),平易近人的性格都是我學(xué)習(xí)的楷模。在課程設(shè)計(jì)的研究

116、及整理期間,,我遇到了不少問題,主要包括程序和課程設(shè)計(jì)的撰寫上的,老師給了我很大的支持和鼓勵(lì),才使得論文得以順利的完成,這是我能順利完成這次報(bào)告的主要原因,更重要的是老師幫我解決了許多技術(shù)上的難題,讓我能把系統(tǒng)做得更加完善。在此期間,我不僅學(xué)到了許多新的知識,而且也開闊了視野,提高了自己的設(shè)計(jì)能力。</p><p>  其次,我要感謝幫助過我的同學(xué),他們也為我解決了不少我不太明白的設(shè)計(jì)商的難題。在作課程設(shè)計(jì)期間,

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論