二叉樹課程設計_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目 錄</b></p><p><b>  1 問題描述1</b></p><p><b>  2 需求分析1</b></p><p><b>  3 概要設計1</b></p><p>  3.1模塊劃分………………

2、……………………………………….1</p><p>  4 詳細設計………6</p><p>  4.1 主要模塊流程圖………………………………………………………………7</p><p>  4.2 數(shù)據(jù)類型的定義………………………………………………8</p><p>  4.3 主要模塊的算法描述…………………………………………8<

3、/p><p><b>  5 測試分析14</b></p><p>  6 課程設計總結17</p><p><b>  參考文獻18</b></p><p>  附錄(源程序清單)19</p><p><b>  1 問題描述</b></p&

4、gt;<p>  建立一棵二叉樹;再以廣義表表示法輸出這棵二叉樹;然后對該樹進行先序、中序、后序遍歷及層次遍歷。</p><p><b>  要求:</b></p><p>  (1)采用二叉鏈表存儲二叉樹;</p><p>  (2)先序、中序、后序遍歷設計非遞歸算法。</p><p><b>

5、  2 需求分析</b></p><p>  二叉樹一種數(shù)據(jù)結構,用于保存和處理樹狀的數(shù)據(jù),比如家譜。他的應用極為廣泛,因為根據(jù)數(shù)據(jù)結構的理論,任何復雜的樹夠可以轉換為二叉中并進行處理,二叉樹在排序、查找、大規(guī)模數(shù)據(jù)索引方面有很多很多應用。而且二叉樹排序是簡單算法排序中速度最快的。</p><p>  在二叉樹的一些應用中,常常要求在樹中查找具有某種特征的節(jié)點,或者對樹中全部節(jié)

6、點逐一進行某種處理。這就提出了遍歷二叉樹。根據(jù)遍歷的方向的選擇,就有了前序遍歷,中序遍歷和后序遍歷以及層次遍歷二叉樹。因此掌握二叉樹的各種遍歷二叉樹算法非常重要,而且高效的遍歷算法能夠節(jié)省很多成本。</p><p><b>  3 概要設計</b></p><p><b>  3.1模塊劃分</b></p><p>  本

7、程序包括七個模塊:</p><p><b>  (1)主程序模塊</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  初始化;</b></p><p>  以廣義表表示法輸出;</

8、p><p><b>  建立二叉樹;</b></p><p>  非遞歸先序遍歷二叉樹并輸出;</p><p>  非遞歸中序遍歷二叉樹并輸出;</p><p>  非遞歸后序遍歷二叉樹并輸出;</p><p>  層次遍歷二叉樹并輸出;</p><p><b>  

9、}</b></p><p> ?。?)以廣義表表示法輸出——實現(xiàn)對二叉樹的輸出</p><p>  (3)二叉樹建立模塊——建立一個二叉樹并</p><p><b>  對二叉樹進行初始化</b></p><p> ?。?)非遞歸先序遍歷模塊——實現(xiàn)對二叉樹的遞歸先序遍歷并輸出</p><

10、p> ?。?)非遞歸中序遍歷模塊——實現(xiàn)對二叉樹的遞歸中序遍歷并輸出</p><p> ?。?)非遞歸后序遍歷模塊——實現(xiàn)對二叉樹的遞歸后序遍歷并輸出</p><p> ?。?)層次遍歷模塊——實現(xiàn)對二叉樹的層次遍歷并輸出</p><p><b>  4 詳細設計</b></p><p>  4.1主要模塊流程圖&

11、lt;/p><p><b>  主流程圖</b></p><p><b>  建立一棵二叉樹</b></p><p>  以廣義表表示法輸出一棵二叉樹</p><p><b>  非遞歸先序遍歷</b></p><p><b>  非遞歸中序遍歷&

12、lt;/b></p><p><b>  非遞歸后序遍歷</b></p><p><b>  層次遍歷</b></p><p>  4.2數(shù)據(jù)類型的定義</p><p>  (1)二叉樹的二叉鏈表存儲類型</p><p>  typedef struct BiTNode

13、</p><p><b>  {</b></p><p>  char data;</p><p>  struct BiTNode *lchild,*rchild;</p><p>  } BiTNode,*BiTree;</p><p><b>  (2)棧類型的定義</b&g

14、t;</p><p>  typedef struct SqStack/*定義一個順序棧*/</p><p><b>  {</b></p><p>  BiTNode *base;</p><p>  BiTNode *top;</p><p>  int stacksize;</p>

15、;<p><b>  } </b></p><p><b>  SqStack;</b></p><p>  void InitStack(SqStack *S)/*棧的初始化*/</p><p><b>  {</b></p><p>  S->base=

16、(BiTNode*)malloc(STACK_INIT_SIZE*sizeof(BiTNode));</p><p>  S->top=S->base;</p><p>  S->stacksize=STACK_INIT_SIZE;</p><p><b>  }</b></p><p>  void

17、Push(SqStack *S,BiTNode e)/*入棧算法*/</p><p><b>  {</b></p><p>  if(S->top-S->base>=S->stacksize)</p><p><b>  {</b></p><p>  S->base

18、=(BiTNode*)realloc(S->base,</p><p>  (S->stacksize+STACKINCREMENT)*sizeof(BiTNode));</p><p>  S->top=S->base+S->stacksize;</p><p>  S->stacksize+=STACKINCREMENT;&l

19、t;/p><p><b>  }</b></p><p>  *(S->top)=e;</p><p><b>  S->top++;</b></p><p><b>  }</b></p><p>  BiTNode Pop(SqStack *

20、S)/*出棧算法*/</p><p><b>  {</b></p><p>  S->top --;</p><p>  return *S->top;</p><p><b>  }</b></p><p>  int StackEmpty(SqStack *

21、S)/*判???/</p><p><b>  {</b></p><p>  if(S->top == S->base )</p><p><b>  return 1;</b></p><p><b>  else</b></p><p>

22、;<b>  return 0;</b></p><p><b>  }</b></p><p>  4.3主要模塊的算法描述</p><p><b>  (1)主函數(shù)</b></p><p>  void main()</p><p><b>

23、;  {</b></p><p>  BiTree Ta;int a=1;</p><p>  printf("請創(chuàng)建樹\n");</p><p>  Ta=CreateBiTree();</p><p>  printf("廣義表表示法輸出二叉樹\n");</p><p

24、>  printfBTree(Ta);</p><p>  printf("\n");</p><p>  printf(" 請選擇:\n");</p><p>  printf(" (1)先序遍歷\n");</p><p>  printf(&q

25、uot; (2)中序遍歷\n");</p><p>  printf(" (3)后序遍歷\n");</p><p>  printf(" (4)層次遍歷\n");</p><p>  printf(" (0)結束程序\n");</p>

26、;<p><b>  while(a)</b></p><p><b>  {</b></p><p>  scanf("%d",&a);</p><p><b>  if(a==1)</b></p><p><b>  {&

27、lt;/b></p><p><b> ?。?)建立二叉樹</b></p><p>  BiTree CreateBiTree()/*以二叉鏈表的存儲方式建立一棵二叉樹*/</p><p><b>  {</b></p><p>  char p;BiTree T;</p>&l

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

29、;/p><p>  T=(BiTNode *)malloc(sizeof(BiTNode));</p><p>  T->data=p;</p><p>  T->lchild=CreateBiTree();</p><p>  T->rchild=CreateBiTree();</p><p><

30、b>  }</b></p><p>  return (T);</p><p><b>  }</b></p><p> ?。?)用廣義表表示法輸出二叉樹</p><p>  void printfbitree(t)/*用廣義表表示法輸出二叉樹*/</p><p><b&g

31、t;  {</b></p><p>  if(t!=NULL)</p><p><b>  {</b></p><p>  printf("%c",t->data);</p><p>  if(t->lchild!=NULL||t->rchild!=NULL)</p

32、><p><b>  {</b></p><p>  printf("(");</p><p>  printfbitree(t->lchild);</p><p>  if(t->rchild!=NULL)</p><p>  printf(","

33、);</p><p>  printfbirree(t->rchild);</p><p>  printf(")");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

34、/b></p><p> ?。?)非遞歸先序遍歷二叉樹</p><p>  void PreOrder(BiTree T)/*非遞歸先序遍歷二叉樹*/</p><p><b>  {</b></p><p>  SqStack S;</p><p>  BiTree p=T;</p&g

35、t;<p>  InitStack(&S);</p><p><b>  if(p)</b></p><p>  Push(&S,*p);</p><p>  while(!StackEmpty(&S))</p><p><b>  {</b></p>

36、;<p>  p=(BiTNode *)malloc(sizeof(BiTNode));</p><p>  *p=Pop(&S);</p><p>  printf("%c",p->data);</p><p>  if(p->rchild)</p><p>  Push(&S,

37、*p->rchild);</p><p>  if(p->lchild)</p><p>  Push(&S,*p->lchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  (5)非遞歸中

38、序遍歷二叉樹</p><p>  void InOrder(BiTree T)/* 非遞歸中序遍歷二叉樹*/</p><p><b>  {</b></p><p>  SqStack S;</p><p>  BiTree p=T;</p><p>  InitStack(&S);<

39、;/p><p>  while(p||!StackEmpty(&S))</p><p><b>  {</b></p><p><b>  if(p)</b></p><p><b>  {</b></p><p>  Push(&S,*p)

40、;</p><p>  p=p->lchild;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  p=(BiTNode *)malloc(sizeof

41、(BiTNode));</p><p>  *p=Pop(&S);</p><p>  printf("%c",p->data);</p><p>  p=p->rchild;</p><p><b>  }</b></p><p><b>  }

42、</b></p><p><b>  }</b></p><p> ?。?)非遞歸后序遍歷二叉樹</p><p>  void PostOrder(BiTree T)/ *非遞歸后序遍歷二叉樹*/</p><p>  SqStack S;</p><p>  BiTNode p, *l

43、, *r;</p><p>  InitStack(&S);</p><p>  Push(&S, *T);</p><p>  while(!StackEmpty(&S))</p><p><b>  {</b></p><p>  p = Pop(&S);<

44、;/p><p>  l = p.lchild;</p><p>  r = p.rchild;</p><p>  if (l == NULL && r == NULL)</p><p><b>  {</b></p><p>  printf("%c", p.da

45、ta);</p><p><b>  } </b></p><p><b>  else </b></p><p><b>  {</b></p><p>  p.lchild = NULL;</p><p>  p.rchild = NULL;<

46、/p><p>  Push(&S, p);</p><p>  if (r != NULL) Push(&S, *r);</p><p>  if (l != NULL) Push(&S, *l);</p><p><b>  }</b></p><p><b>  

47、}</b></p><p><b>  }</b></p><p><b> ?。?)層次遍歷</b></p><p>  void LevelOrderTraverse(BiTree T) /*層序遍歷*/</p><p><b>  { </b></p&g

48、t;<p>  BiTree Q[STACK_INIT_SIZE]; </p><p>  int front=0,rear=0; </p><p>  BiTree p; </p><p><b>  if(T)</b></p><p>  { //根結點入隊 </p><p> 

49、 Q[rear]=T; </p><p>  rear=(rear+1)%STACK_INIT_SIZE; </p><p><b>  } </b></p><p>  while(front!=rear)</p><p><b>  { </b></p><p>  p=

50、Q[front]; //隊頭元素出隊 </p><p>  front=(front+1)%STACK_INIT_SIZE; </p><p>  printf("%c",p->data); </p><p>  if(p->lchild)</p><p>  { //左孩子不為空,入隊 </p>

51、<p>  Q[rear]=p->lchild; </p><p>  rear=(rear+1)%STACK_INIT_SIZE; </p><p><b>  } </b></p><p>  if(p->rchild){ //右孩子不為空,入隊 </p><p>  Q[rear]=p-&g

52、t;rchild; </p><p>  rear=(rear+1)%STACK_INIT_SIZE; </p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p><

53、;b>  5 測試分析</b></p><p><b>  6 課程設計總結</b></p><p>  通過這次課程設計使我充分的理解了從建立二叉樹到輸出二叉樹再遍歷二叉樹的基本原理與算法,尤其是深刻的學習了二叉樹遍歷的非遞歸實現(xiàn)的算法。之前由于二叉樹的非遞歸實現(xiàn)不是考試的要點,自己都沒怎么去學那方面的知識,對于算法更是沒明白。但通過這次課程設計后

54、,我對二叉樹的非遞歸實現(xiàn)的算法基本上了解了。雖然這次課程設計由于我們的程序問題耽誤了很多時間,但我們覺得非常值得,因為在耗費時間的同時,我們自己對程序的算法也理解的更加深刻了。這次的程序設計雖然并不是很完備,但是對于我來說,已經(jīng)覺得是很大的收獲了。我想以后再做課程設計的話,我的思路一定會更加清晰,也會做的更加順利了。</p><p>  在此我非常要感謝的是我的指導老師成婭輝老師,感謝老師對我們程序的細心認真的輔

55、導,讓我對數(shù)據(jù)結構這門課程也越來越了解,越來越感興趣了。同時我還要感謝所有幫助過我的人以及我的隊友們,衷心的謝謝他們。</p><p><b>  參考文獻</b></p><p>  [1] 黃同成,黃俊民,董建寅.數(shù)據(jù)結構[M].北京:中國電力出版社,2008</p><p>  [2] 董建寅,黃俊民,黃同成.數(shù)據(jù)結構實驗指導與題解[M]

56、.北京:中國電力出版社,2008</p><p>  [3] 嚴蔚敏,吳偉民. 數(shù)據(jù)結構(C語言版)[M]. 北京:清華大學出版社,2002</p><p>  [4] 劉振鵬,張曉莉,郝杰.數(shù)據(jù)結構[M].北京:中國鐵道出版社,2003</p><p><b>  附錄(源程序清單)</b></p><p>  #in

57、clude <stdio.h></p><p>  #include <stdlib.h></p><p>  #include <malloc.h></p><p>  #define STACK_INIT_SIZE 100</p><p>  #define STACKINCREMENT 10<

58、;/p><p>  typedef struct BiTNode/*二叉樹的二叉鏈表存儲類型*/</p><p><b>  {</b></p><p>  char data;</p><p>  struct BiTNode *lchild,*rchild;</p><p>  } BiTNode

59、,*BiTree;</p><p>  typedef struct SqStack/*定義一個順序棧*/</p><p><b>  {</b></p><p>  BiTNode *base;</p><p>  BiTNode *top;</p><p>  int stacksize;&l

60、t;/p><p><b>  } </b></p><p><b>  SqStack;</b></p><p>  void InitStack(SqStack *S)/*棧的初始化*/</p><p><b>  {</b></p><p>  S-&g

61、t;base=(BiTNode*)malloc(STACK_INIT_SIZE*sizeof(BiTNode));</p><p>  S->top=S->base;</p><p>  S->stacksize=STACK_INIT_SIZE;</p><p><b>  }</b></p><p>

62、  void printfBTree(BiTree bt)/*用廣義表表示法輸出二叉樹*/</p><p><b>  {</b></p><p>  if(bt!=NULL)</p><p><b>  {</b></p><p>  printf("%c",bt->da

63、ta);</p><p>  if(bt->lchild!=NULL||bt->rchild!=NULL)</p><p><b>  {</b></p><p>  printf("(");</p><p>  printfBTree(bt->lchild);</p>

64、<p>  if(bt->rchild!=NULL)</p><p>  printf(",");</p><p>  printfBTree(bt->rchild);</p><p>  printf(")");</p><p><b>  }</b>&l

65、t;/p><p><b>  }</b></p><p><b>  }</b></p><p>  void Push(SqStack *S,BiTNode e)/*入棧算法*/</p><p><b>  {</b></p><p>  if(S->

66、;top-S->base>=S->stacksize)</p><p><b>  {</b></p><p>  S->base=(BiTNode*)realloc(S->base,</p><p>  (S->stacksize+STACKINCREMENT)*sizeof(BiTNode));</

67、p><p>  S->top=S->base+S->stacksize;</p><p>  S->stacksize+=STACKINCREMENT;</p><p><b>  }</b></p><p>  *(S->top)=e;</p><p><b>

68、;  S->top++;</b></p><p><b>  }</b></p><p>  BiTNode Pop(SqStack *S)/*出棧算法*/</p><p><b>  {</b></p><p>  S->top --;</p><p&g

69、t;  return *S->top;</p><p><b>  }</b></p><p>  int StackEmpty(SqStack *S)/*判???/</p><p><b>  {</b></p><p>  if(S->top == S->base )</

70、p><p><b>  return 1;</b></p><p><b>  else</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  BiTree Crea

71、teBiTree()/*以二叉鏈表的存儲方式建立一棵二叉樹*/</p><p><b>  {</b></p><p>  char p;BiTree T;</p><p>  scanf("%c",&p);</p><p>  if(p=='#')</p>&l

72、t;p><b>  T=NULL;</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  T=(BiTNode *)malloc(sizeof(BiTNode));</p><p>  T->data=p;

73、</p><p>  T->lchild=CreateBiTree();</p><p>  T->rchild=CreateBiTree();</p><p><b>  }</b></p><p>  return (T);</p><p><b>  }</b&g

74、t;</p><p>  void PreOrder(BiTree T)/*非遞歸先序遍歷二叉樹*/</p><p><b>  {</b></p><p>  SqStack S;</p><p>  BiTree p=T;</p><p>  InitStack(&S);</p&

75、gt;<p><b>  if(p)</b></p><p>  Push(&S,*p);</p><p>  while(!StackEmpty(&S))</p><p><b>  {</b></p><p>  p=(BiTNode *)malloc(sizeof

76、(BiTNode));</p><p>  *p=Pop(&S);</p><p>  printf("%c",p->data);</p><p>  if(p->rchild)</p><p>  Push(&S,*p->rchild);</p><p>  if

77、(p->lchild)</p><p>  Push(&S,*p->lchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void InOrder(BiTree T)/* 非遞歸中序遍歷二叉樹*/</p>

78、<p><b>  {</b></p><p>  SqStack S;</p><p>  BiTree p=T;</p><p>  InitStack(&S);</p><p>  while(p||!StackEmpty(&S))</p><p><b&

79、gt;  {</b></p><p><b>  if(p)</b></p><p><b>  {</b></p><p>  Push(&S,*p);</p><p>  p=p->lchild;</p><p><b>  }<

80、/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  p=(BiTNode *)malloc(sizeof(BiTNode));</p><p>  *p=Pop(&S);</p><p>  prin

81、tf("%c",p->data);</p><p>  p=p->rchild;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  

82、void PostOrder(BiTree T)/ *非遞歸后序遍歷二叉樹*/</p><p>  SqStack S;</p><p>  BiTNode p, *l, *r;</p><p>  InitStack(&S);</p><p>  Push(&S, *T);</p><p>  whi

83、le(!StackEmpty(&S))</p><p><b>  {</b></p><p>  p = Pop(&S);</p><p>  l = p.lchild;</p><p>  r = p.rchild;</p><p>  if (l == NULL &&

84、amp; r == NULL)</p><p><b>  {</b></p><p>  printf("%c", p.data);</p><p><b>  } </b></p><p><b>  else </b></p><p

85、><b>  {</b></p><p>  p.lchild = NULL;</p><p>  p.rchild = NULL;</p><p>  Push(&S, p);</p><p>  if (r != NULL) Push(&S, *r);</p><p> 

86、 if (l != NULL) Push(&S, *l);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void LevelOrderTraverse(BiTree T) /

87、*層序遍歷*/</p><p><b>  { </b></p><p>  BiTree Q[STACK_INIT_SIZE]; </p><p>  int front=0,rear=0; </p><p>  BiTree p; </p><p><b>  if(T)</b

88、></p><p>  { //根結點入隊 </p><p>  Q[rear]=T; </p><p>  rear=(rear+1)%STACK_INIT_SIZE; </p><p><b>  } </b></p><p>  while(front!=rear)</p>

89、<p><b>  { </b></p><p>  p=Q[front]; //隊頭元素出隊 </p><p>  front= (front+1)%STACK_INIT_SIZE; </p><p>  if(p->lchild)</p><p>  printf("%c",p

90、->data); </p><p>  { //左孩子不為空,入隊 </p><p>  Q[rear]=p->lchild; </p><p>  rear=(rear+1)%STACK_INIT_SIZE; </p><p><b>  }</b></p><p>  if(p-&

91、gt;rchild){ //右孩子不為空,入隊 </p><p>  Q[rear]=p->rchild; </p><p>  rear=(rear+1)%STACK_INIT_SIZE; </p><p><b>  } </b></p><p><b>  } </b></p>

92、;<p><b>  } </b></p><p>  void main()</p><p><b>  {</b></p><p>  BiTree Ta;int a=1;</p><p>  printf("請創(chuàng)建樹\n");</p><p

93、>  Ta=CreateBiTree();</p><p>  printf("廣義表表示法輸出二叉樹\n");</p><p>  printfBTree(Ta);</p><p>  printf("\n");</p><p>  printf(" 請選擇:\n&qu

94、ot;);</p><p>  printf(" (1)先序遍歷\n");</p><p>  printf(" (2)中序遍歷\n");</p><p>  printf(" (3)后序遍歷\n");</p><p>  printf(&q

95、uot; (4)層次遍歷\n");</p><p>  printf(" (0)結束程序\n");</p><p><b>  while(a)</b></p><p><b>  {</b></p><p>  scanf("%d

96、",&a);</p><p><b>  if(a==1)</b></p><p><b>  {</b></p><p>  printf("先序遍歷:\n");</p><p>  printf("\n");</p><

97、;p>  PreOrder(Ta);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  else if(a==2)</p><p><b>  {</b></p><p>  printf(&

98、quot;中序遍歷:\n");</p><p>  InOrder(Ta);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  else if(a==3)</p><p><b>  {</b&

99、gt;</p><p>  printf("后序遍歷:\n");</p><p>  PostOrder(Ta);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  else if(a==4)<

100、/p><p><b>  { </b></p><p>  printf("層次遍歷:\n");</p><p>  LevelOrderTraverse(Ta);</p><p>  printf("\n");</p><p><b>  }&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論