數據結構二叉排序樹課程設計報告_第1頁
已閱讀1頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  課 程 設 計 報 告</p><p><b>  ——數據結構</b></p><p><b>  題目:二叉排序樹</b></p><p>  姓 名: </p><p><b>  學 號:</b></p&

2、gt;<p><b>  專 業(yè):</b></p><p>  班 級: </p><p><b>  指導老師: </b></p><p><b>  年 月 日</b></p><p><b>  目 錄</b>&

3、lt;/p><p>  一、課程設計簡介3</p><p>  二、原理分析及流程3</p><p>  2.1、原理分析............................................................................3</p><p>  2.2、流程圖................

4、................................................................4</p><p>  1、main()函數....................................................................4</p><p>  2、創(chuàng)建..........................

5、.....................................................4</p><p>  3、插入...............................................................................5</p><p>  4、查找................................

6、...............................................6</p><p>  5、中序遍歷輸出7</p><p><b>  三、算法描述8</b></p><p>  3.1、存儲結構8</p><p>  3.2、插入算法8</p><p>  

7、3.3、查找算法9</p><p>  3.4、刪除算法10</p><p>  四、小結與體會12</p><p>  五、程序執(zhí)行過程13</p><p>  5.1、創(chuàng)建二叉排序樹并中序輸出.........................................13 5.2、插入并中序輸出..............

8、................................................13</p><p>  5.3、查找..................................................................................14</p><p><b>  六、程序清單14</b></p

9、><p><b>  一、課程設計簡介</b></p><p>  1.1、題目:二叉排序樹相關操作</p><p>  1、創(chuàng)建二叉排序樹;2、插入給定值;</p><p>  3、查找給定值; 4、刪除給定值的結點。</p><p><b>  1.2、報告要求:</b>

10、;</p><p>  1、封面; 2、題目與流程圖或模塊圖;</p><p>  3、程序清單和運行結果; 4、小結(收獲和體會);</p><p><b>  5、裝訂成冊。</b></p><p><b>  1.3、目的:</b></p><

11、;p>  課程設計為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結合起來,鍛煉學生的分析解決實際問題的能力。提高學生適應實際,實踐編程的能力。</p><p><b>  二、原理分析及流程</b></p><p><b>  2.1、原理分析:</b></p><p>  根據題目要求

12、,要實現這些功能,就必須創(chuàng)建一個菜單。這個菜單設置在main()函數里面,然后使用while()...switch()語句進行循環(huán)調用相關函數,以達到實現相關功能的目的。</p><p><b>  2.2、流程圖:</b></p><p>  1、main()函數:</p><p><b>  2、創(chuàng)建:</b><

13、/p><p><b>  3、插入:</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b></

14、p><p><b>  4、查找:</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  YN</b></p><p><b>  5、中序遍歷輸出:</b

15、></p><p><b>  三、算法描述</b></p><p><b>  3.1、存儲結構</b></p><p>  定義一個鏈表式的二叉排序樹,用鏈表的方式構造結點,存儲二叉排序樹中的結點、結點類型和指針類型如下:</p><p>  #include <stdio.h>

16、;</p><p>  #define null 0</p><p>  typedef int keytype;</p><p>  typedef struct node</p><p><b>  {</b></p><p>  keytype key;</p><p&g

17、t;  struct node *lchild,*rchild;</p><p>  }bstnode,*bstree;</p><p><b>  3.2、插入算法</b></p><p>  在二叉排序樹中插入一個新節(jié)點,首先要查找該節(jié)點在二叉排序樹中是否已經存在。若二叉排序樹中不存在關鍵字等于x的節(jié)點,則插入。</p>&l

18、t;p>  將一個關鍵字值為x的節(jié)點s插入到二叉排序樹中,可以用下面的方法:</p><p>  (1)若二叉排序樹為空,則關鍵字為x的節(jié)點s成為二叉排序樹的根</p><p> ?。?)若二叉排序樹非空,則將x與二叉排序樹根進行比較,如果x的值等于根節(jié)點關鍵值,則停止插入;如果x的根節(jié)點值小于根節(jié)點關鍵值,則將x插入左子樹;如果x的值大于根節(jié)點關鍵字的值,則將x插入右子樹。在左右兩

19、個子樹的插入方法與整個二叉排序樹相同。</p><p><b>  算法如下:</b></p><p>  void insert(bstree *t,keytype x)</p><p><b>  {</b></p><p><b>  bstree s;</b></

20、p><p>  if(*t==null)</p><p><b>  {</b></p><p>  s=(bstree)malloc(sizeof(bstnode));</p><p><b>  s->key=x;</b></p><p>  s->lchild=

21、null;</p><p>  s->rchild=null;</p><p><b>  *t=s;</b></p><p><b>  }</b></p><p>  else if(x<(*t)->key)</p><p>  insert(&

22、((*t)->lchild),x);</p><p>  else if(x>(*t)->key)</p><p>  insert(&((*t)->rchild),x);</p><p><b>  } </b></p><p><b>  3.3、查找算法</b>

23、</p><p> ?。?)若二叉排序樹不為空,將根結點的關鍵字與待查關鍵字進行比較,若相等,則查找成功;若根節(jié)點關鍵字大于待查值,則進入左子樹重復次步驟,否則,進入右子樹進行此步驟;若在查找過程中遇到二叉排序樹的葉子節(jié)點時,還沒有找到待查節(jié)點,則查找不成功。</p><p> ?。?)否則,查找失敗,返回null。</p><p><b>  算法如下:

24、</b></p><p>  bstree search(bstree t,keytype x)</p><p><b>  {</b></p><p><b>  bstree p;</b></p><p><b>  p=t;</b></p>&l

25、t;p>  if(p!=null)</p><p><b>  {</b></p><p>  if (x==p->key) return p->key;</p><p>  else if(x<p->key) return search(p->lchild,x);</p><p> 

26、 else return search(p->rchild,x);</p><p><b>  }</b></p><p><b>  else</b></p><p>  { printf("%d can not be found\n",x);return null;</p>&l

27、t;p><b>  }</b></p><p><b>  }</b></p><p><b>  3.4、刪除算法</b></p><p>  在二叉排序樹中刪除節(jié)點,首先要確定被刪除的節(jié)點是否在二叉排序樹中。</p><p>  若不在,則不做任何操作;否則,假設要刪

28、除的節(jié)點為p,節(jié)點p的父節(jié)點為r,并假設p是r的左孩子。根據被刪除節(jié)點p有無孩子,刪除部分可做以下3中情況討論:</p><p> ?。?)若p為葉子節(jié)點,則可令其父節(jié)點r的左孩子指針域為空,直接將其刪除。</p><p> ?。?)若p節(jié)點只有右子樹或左子樹,則可以將p的左子樹或右子樹直接改為其雙親節(jié)點r的左子樹。</p><p> ?。?)若p既有左子樹又有右子

29、樹;將節(jié)點s為p的中序前驅。首先找到p的中序前驅節(jié)點s,然后用節(jié)點s的值代替節(jié)點p的值,再將節(jié)點s刪除,節(jié)點s的原左子樹改為s的雙親節(jié)點q的右子樹。</p><p><b>  算法如下:</b></p><p>  bstree delete(bstree t,keytype x)</p><p><b>  {</b>

30、</p><p>  bstree p,q,r,s;</p><p><b>  p=t;</b></p><p><b>  r=null;</b></p><p><b>  while(p)</b></p><p><b>  {<

31、/b></p><p>  if(x==p->key) break;</p><p><b>  r=p;</b></p><p>  if(x<p->key) p=p->lchild;</p><p>  else p=p->rchild;</p>

32、;<p><b>  }</b></p><p>  if(p==null) {printf("%d is not exist!\n",x);return t;}</p><p>  if((p->lchild==null)||(p->rchild==null))</p><p><b&g

33、t;  {</b></p><p>  if(r==null)</p><p>  if(p->lchild==null)</p><p>  t=p->rchild;</p><p>  else t=p->lchild;</p><p>  else if(p->lchild=

34、=null)</p><p>  if(r->lchild==p)</p><p>  r->lchild=p->rchild;</p><p>  else r->rchild=p->rchild;</p><p>  else if(r->lchild==p)</p><p> 

35、 r->lchild=p->lchild;</p><p>  else r->lchild=p->lchild;</p><p><b>  free(p);</b></p><p><b>  }</b></p><p><b>  else</b>

36、</p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  s->lchild;</p><p>  while(s->rchild)</p><p>  {q=s;s->rchild;}</p>

37、<p>  if(q==p) q->lchild=s->lchild;</p><p>  else p->key=s->key;</p><p><b>  free(s);</b></p><p><b>  }</b></p><p><b

38、>  return t;</b></p><p><b>  }</b></p><p><b>  四、小結與體會</b></p><p>  經過一個多星期來夜以繼日的努力,終于把課程設計——二叉排序樹的相關算法全部完成!在編寫程序過程中,讓我對二叉排序樹的創(chuàng)建、插入、查找、刪除算法有了較系統(tǒng)的認識,

39、也發(fā)現了一些以前紙上談兵時的思想誤區(qū)。比如實現插入功能時,從根節(jié)點開始比較;當實現刪除功能時,如果待刪除結點p左、右子樹齊全,首先找到p的中序前驅節(jié)點s(p的中序前驅),然后用節(jié)點s的值代替節(jié)點p的值,再將節(jié)點s刪除,節(jié)點s的原左子樹改為s的雙親節(jié)點q的右子樹。實現中序遍歷功能時,采用遞歸思想......</p><p>  這是第一次關于編寫程序的課程設計。雖然上機安排只有兩天時間,可卻并不像平時上機實驗一樣,

40、離開了機房就不用再對著電腦屏幕編寫代碼,更多的工作實在離開機房后完成的。一遍一遍地按F9調試程序,error從幾十個減少到幾個,再到只剩幾個warring,當按下Ctrl+F9,那精心設計的“菜單”出現在屏幕上時,那一刻的心情無以言表!涌上心頭的除了自豪感、成就感之外,還有對編程工作之辛苦的慨嘆!因為自己專業(yè)將來的方向與這有關,不免讓我考慮起畢業(yè)后的發(fā)展方向。如果朝這方面發(fā)展的話,我是否可以勝任這樣的工作?如果不是,又該選擇什么?<

41、;/p><p><b>  程序執(zhí)行過程</b></p><p>  5.1、創(chuàng)建二叉排序樹并中序輸出</p><p>  5.2插入并中序輸出</p><p><b>  5.3、查找</b></p><p>  5.4、刪除并中序輸出</p><p>

42、<b>  六、程序清單</b></p><p>  #include <stdio.h></p><p>  #define null 0</p><p>  typedef int keytype;</p><p>  typedef struct node</p><p><

43、;b>  {</b></p><p>  keytype key;</p><p>  struct node *lchild,*rchild;</p><p>  }bstnode,*bstree;</p><p>  void insert(bstree *t,keytype x);</p><p&g

44、t;  bstree search(bstree t,keytype x);</p><p>  void display(bstree t);</p><p>  void create(bstree *t)</p><p><b>  {</b></p><p>  keytype x;</p><

45、;p><b>  *t=null;</b></p><p>  scanf("%d",&x);</p><p>  while(x!=-1)</p><p><b>  {</b></p><p>  insert(t,x);</p><p>

46、;  scanf("%d",&x);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void insert(bstree *t,keytype x)</p><p><b>  {</b><

47、/p><p><b>  bstree s;</b></p><p>  if(*t==null)</p><p><b>  {</b></p><p>  s=(bstree)malloc(sizeof(bstnode));</p><p><b>  s->

48、key=x;</b></p><p>  s->lchild=null;</p><p>  s->rchild=null;</p><p><b>  *t=s;</b></p><p><b>  }</b></p><p>  else if(x

49、<(*t)->key)</p><p>  insert(&((*t)->lchild),x);</p><p>  else if(x>(*t)->key)</p><p>  insert(&((*t)->rchild),x);</p><p><b>  }</b>

50、;</p><p>  bstree search(bstree t,keytype x)</p><p><b>  {</b></p><p><b>  bstree p;</b></p><p><b>  p=t;</b></p><p>  

51、if(p!=null)</p><p><b>  {</b></p><p>  if (x==p->key) return p->key;</p><p>  else if(x<p->key) return search(p->lchild,x);</p><p>  else ret

52、urn search(p->rchild,x);</p><p><b>  }</b></p><p><b>  else</b></p><p>  { printf("%d can not be found\n",x);</p><p>  return null;

53、</p><p><b>  }</b></p><p><b>  }</b></p><p>  bstree delete(bstree t,keytype x)</p><p><b>  {</b></p><p>  bstree p,q,r

54、,s;</p><p><b>  p=t;</b></p><p><b>  r=null;</b></p><p><b>  while(p)</b></p><p><b>  {</b></p><p>  if(x==

55、p->key) break;</p><p><b>  r=p;</b></p><p>  if(x<p->key) p=p->lchild;</p><p>  else p=p->rchild;</p><p><b>  }</b>&

56、lt;/p><p>  if(p==null) {printf("%d is not exist!\n",x);return t;}</p><p>  if((p->lchild==null)||(p->rchild==null))</p><p><b>  {</b></p><p>

57、;  if(r==null)</p><p>  if(p->lchild==null)</p><p>  t=p->rchild;</p><p><b>  else</b></p><p>  t=p->lchild;</p><p>  else if(p->lc

58、hild==null)</p><p>  if(r->lchild==p)</p><p>  r->lchild=p->rchild;</p><p><b>  else</b></p><p>  r->rchild=p->rchild;</p><p>  

59、else if(r->lchild==p)</p><p>  r->lchild=p->lchild;</p><p><b>  else</b></p><p>  r->lchild=p->lchild;</p><p><b>  free(p);</b>&l

60、t;/p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  q=p;</b></p><p>  s->lchild;</p&g

61、t;<p>  while(s->rchild)</p><p>  {q=s;s->rchild;}</p><p><b>  if(q==p)</b></p><p>  q->lchild=s->lchild;</p><p><b>  else</b>

62、;</p><p>  p->key=s->key;</p><p><b>  free(s);</b></p><p><b>  }</b></p><p><b>  return t;</b></p><p><b>  

63、}</b></p><p>  void display(bstree t)</p><p><b>  {</b></p><p>  if(t!=null)</p><p><b>  {</b></p><p>  display(t->lchild)

64、;</p><p>  printf("%5d",t->key);</p><p>  display(t->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void mai

65、n(void)</p><p><b>  {</b></p><p>  bstree t,b;</p><p>  int i=1,j;</p><p>  keytype x;</p><p><b>  while(i)</b></p><p>

66、;<b>  {</b></p><p>  printf("\n* * * * * * * * * * * * * * * *\n");</p><p>  printf("\n* MENU OF BSTREE *\n");</p><p>  printf("\n*

67、 1.create 2.insert *\n");</p><p>  printf("\n* 3.search 4.delete *\n");</p><p>  printf("\n* 5.exit *\n");</p><p> 

68、 printf("\n* * * * * * * * * * * * * * * *\n");</p><p>  printf(" what do you want to do? :");scanf("%d",&j);</p><p><b>  switch(j)</b></p>&

69、lt;p><b>  {</b></p><p>  case 1: printf("input bstree's values,end with -1:\n");create(&t);</p><p>  printf("bstree's root is %d\n",t->key);di

70、splay(t);break;</p><p>  case 2: printf("input the insert value:");scanf("%d",&x);</p><p>  insert(&t,x);display(t);break;</p><p>  case 3: printf(&q

71、uot;input the search value:");scanf("%d",&x);</p><p>  printf("result is: %d",search(t,x));break;</p><p>  case 4: printf("input the delete value:");scan

72、f("%d",&x);</p><p>  delete(t,x);display(t);break;</p><p>  case 5: i=0;break;</p><p><b>  }</b></p><p><b>  }</b></p>&l

溫馨提示

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

評論

0/150

提交評論