數(shù)據(jù)結構課程設計---二叉樹的建立和遍歷的演示_第1頁
已閱讀1頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設計任務書</b></p><p>  題 目: 二叉樹的建立和遍歷的演示(基于動態(tài)二叉鏈表)</p><p><b>  初始條件:</b></p><p>  理論:學習了《數(shù)據(jù)結構》課程,掌握了一種計算機高級語言。</p><p>  實踐:計算機技術系實

2、驗中心提供計算機及軟件開發(fā)環(huán)境。</p><p>  要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)</p><p>  1、系統(tǒng)應具備的功能:</p><p> ?。?)建立二叉樹的動態(tài)二叉鏈表存儲結構</p><p> ?。?)用遞歸算法和非遞歸算法實現(xiàn)二叉樹的各種遍歷</p><p

3、><b> ?。?)演示結果</b></p><p><b>  2、數(shù)據(jù)結構設計;</b></p><p><b>  3、主要算法設計;</b></p><p>  4、編程及上機實現(xiàn);</p><p>  5、撰寫課程設計報告,包括:</p><

4、p><b> ?。?)設計題目;</b></p><p> ?。?)摘要和關鍵字(中文和英文);</p><p> ?。?)正文,包括引言、需求分析、數(shù)據(jù)結構設計、算法設計、有關技術的討論、設計體會等;</p><p><b> ?。?)結束語;</b></p><p><b>  

5、(5)參考文獻。</b></p><p>  時間安排: 2011年1月10日-14日 (第19周)</p><p>  1月10日 查閱資料</p><p>  1月11日 系統(tǒng)設計,數(shù)據(jù)結構設計,算法設計</p><p>  1月12日-13日 編程并上機調(diào)試</p><p>  1月14日

6、 撰寫報告</p><p>  1月15日 驗收程序,提交設計報告書。</p><p>  指導教師簽名: 2011年1月10日</p><p>  系主任(或責任教師)簽名: 年 月 日</p><p>  二叉樹的建立和遍歷的演示<

7、;/p><p> ?。ɑ趧討B(tài)二叉鏈表)</p><p>  摘 要:二叉樹是每個結點最多有兩個子樹的有序樹。通常節(jié)點的子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規(guī)則和順序走遍二叉樹的所有結點,使每一個結點都被訪問一次,而且只被訪問一次。由于二叉樹是非線性結構,因此,樹的遍歷實質(zhì)上是將

8、二叉樹的各個結點轉(zhuǎn)換成為一個線性序列來表示。常用的遍歷方法有先序遍歷、中序遍歷和后續(xù)遍歷,這三種遍歷方法都可以通過遞歸和非遞歸算法實現(xiàn)。對于二叉樹的三種遍歷過程,如果用非遞歸算法來實現(xiàn),則要復雜一些。</p><p><b>  Abstract:</b></p><p>  Binary tree is an orderly tree that each node

9、hava no more than two sub-trees. Subtree node is usually referred to as the "left sub-tree" and "the right sub-tree". Traversal of a tree is the most basic computing, the so-called binary tree traver

10、sal, that is, according to certain rules and order of every tree of all nodes and each node have been visited once. Binary tree structure as a result of non-linear, therefore, the tree is to traverse all tree nodes can c

11、onverted into a linear sequence to</p><p>  關鍵詞:二叉樹 遍歷 遞歸</p><p>  Key words:</p><p>  Binary tree traversal recursive</p><p><b>  1引 言</b>

12、</p><p>  在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用作二叉查找樹和二叉堆。</p><p>  遍歷也稱周游,是指按一定的規(guī)律,訪問二叉樹樹的結點,使每個結點被訪問一次,且只被訪問一次。訪問的含義可以是查詢某元素、修改某元素、輸出某元素的值,以及對元素作

13、某種運算等等。這實際上是二叉樹的結點排成一個線性序列的過程。由于二叉樹是非線性結構,因此,為得到這樣的一個線性序列,必須規(guī)定遍歷的次序。</p><p>  常用的遍歷方法有先序遍歷、中序遍歷和后序遍歷這三種方法 ,并都可用遞歸和非遞歸算法來實現(xiàn)。在非遞歸的先序、中序和后序遍歷算法中,需要定義一個棧,來暫存遍歷過程中所遇到的結點的地址,以便實現(xiàn)回溯。棧(stack)在計算機科學中是限定僅在表尾進行插入或刪除操作的

14、線形表。它是是一種數(shù)據(jù)結構,它按照后進先出的原則存儲數(shù)據(jù),先進入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時候從棧頂開始彈出數(shù)據(jù)(最后一個數(shù)據(jù)被第一個讀出來)。所以它非常適合存儲二叉樹的節(jié)點信息。</p><p>  1.1課程設計的任務</p><p>  建立二叉樹的動態(tài)二叉鏈表存儲結構,用遞歸算法和非遞歸算法實現(xiàn)二叉樹的各種遍歷,并演示結果</p><p&g

15、t;  1.2課程設計的性質(zhì)</p><p>  由要求分析知,本設計主要要求解決二叉樹的建立以及三種遍歷的遞歸和非遞歸算法的實現(xiàn)。所以設計一個良好的先序、中序和后序的遞歸、非遞歸遍歷算法非常重要。</p><p>  1.3課程設計的目的和意義</p><p>  在此過程中我們將會了解編程的一些方法和技巧,認識到實現(xiàn)一個問有提出問題、分析問題、設計問題、實現(xiàn)等環(huán)

16、節(jié)。此實踐過程會是大家熟練掌握基本的數(shù)據(jù)結構和常用的算法,并最終設計一個能夠解決實際問題并具有一定規(guī)模的</p><p><b>  大學數(shù)據(jù)課程設計。</b></p><p>  這次做程序設計目的是為更好地掌握C語言編寫數(shù)據(jù)結構程序的方法和技巧,了解C語言的強大的功能,更好地學習C語言,并且在這個過程中更好地鍛煉自己的動手能力和實踐能力。</p>&

17、lt;p>  通過對此次數(shù)據(jù)結構大型作業(yè)內(nèi)容的分析,鍛煉學生分析與編寫大型軟件代碼的能力。通過與同組同學的合作,鍛煉協(xié)作的能力。</p><p><b>  2需求分析</b></p><p>  二叉樹一種數(shù)據(jù)結構,用于保存和處理樹狀的數(shù)據(jù),比如家譜。他的應用極為廣泛,因為根據(jù)數(shù)據(jù)結構的理論,任何復雜的樹夠可以轉(zhuǎn)換為二叉中并進行處理,二叉樹在排序、查找、大規(guī)模

18、數(shù)據(jù)索引方面有很多很多應用。而且二叉樹排序是簡單算法排序中速度最快的。</p><p>  在二叉樹的一些應用中,常常要求在樹中查找具有某種特征的節(jié)點,或者對樹中全部節(jié)點逐一進行某種處理。這就提出了遍歷二叉樹。根據(jù)遍歷的方向的選擇,就有了先序、中序和后序遍歷二叉樹。因此掌握二叉樹的三種遍歷二叉樹算法非常重要,而且高效的后序遍歷算法能夠節(jié)省很多成本。</p><p><b>  3

19、數(shù)據(jù)結構設計</b></p><p><b>  二叉樹的結點結構體</b></p><p>  typedef int datatype; /* datatype可以為任何類型,這里假設為int*/</p><p>  typedef struct node </p><p>  {

20、 /*結構體*/</p><p>  char data; /*數(shù)據(jù)域*/</p><p>  struct node *lchild,*rchild; /*左右孩子指針*/</p><p><b>  }bitr

21、ee;</b></p><p><b>  棧的數(shù)據(jù)結構設計</b></p><p>  typedef struct StackElemType//棧的結構體</p><p><b>  {</b></p><p>  BiNode ptr;</p><p>&

22、lt;b>  int flag;</b></p><p>  }StackElemType;</p><p><b>  4算法設計</b></p><p><b>  4.1算法分析</b></p><p>  4.1.1二叉樹創(chuàng)建</p><p>  用

23、鏈表實現(xiàn)創(chuàng)建一個樹結點的結構體,從鍵盤輸入數(shù)據(jù),存入數(shù)組。把下標為2*i+1 的值存入左孩子,為2*i+2的存入右孩子。BiNode creat(),BiNode stree_creat(char *a,int k)。 </p><p>  4.1.2先序遍歷二叉樹的遞歸算法</p><p>  若二叉樹為空,則空操作;否則(1)訪問根結點;(2)先序遍歷左子樹;(3)先序遍歷右子樹。vo

24、id PreOrder(BiNode root)。</p><p>  4.1.3中序遍歷二叉樹的遞歸算法</p><p>  若二叉樹為空,則空操作;否則(1)中序遍歷左子樹;(2)訪問根結點;(3)中序遍歷右子樹。void InOrder(BiNode root)。</p><p>  4.1.4后序遍歷二叉樹的遞歸算法</p><p>

25、  若二叉樹為空,則空操作;否則(1)后序遍歷左子樹;(2)后序遍歷右子樹。(3)訪問根結點;void PostOrder(BiNode root)。</p><p>  4.1.5先序非遞歸算法</p><p>  BiNode根指針,若 BiNode!= NULL對于非遞歸算法,引入棧模擬遞歸工作棧,初始時棧為空。void F_PreOrder(BiNode root)</p&g

26、t;<p>  4.1.6中序非遞歸算法</p><p>  BiNode是要遍歷樹的根指針,中序遍歷要求在遍歷完左子樹后,訪問根,再遍歷右子樹。void F_inOrder(BiNode root)。</p><p>  4.1.7后序非遞歸算法</p><p>  BiNode是要遍歷樹的根指針,后序遍歷要求在遍歷完左右子樹后,再訪問根</p

27、><p>  需要判斷根結點的左右子樹是否均遍歷過。void F_PostOrder(BiNode root)。</p><p><b>  4.2流程圖</b></p><p>  圖 1 二叉樹的創(chuàng)建</p><p>  圖2 前序遞歸遍歷</p><p>  圖3 中序遞歸遍歷</p

28、><p>  圖4 后序遞歸遍歷</p><p>  圖5、前序非遞歸遍歷</p><p>  圖6 中序非遞歸遍歷</p><p><b>  4.3算法代碼</b></p><p>  4.3.1二叉樹的建立</p><p>  BiNode stree_creat(c

29、har *a,int k) </p><p><b>  {</b></p><p>  BiNode root; max++;</p><p>  if(a[k]=='\0'||k>maxsize) </p><p>  return NULL; //判斷樹是否為空</p><

30、p><b>  else </b></p><p><b>  {</b></p><p>  root=(BiNode)malloc(LEN);//動態(tài)申請節(jié)點</p><p>  root->data=a[k]; </p><p>  root->lchild=stree_cr

31、eat(a,2*k+1); //遞歸調(diào)用為左孩子賦值</p><p>  root->rchild=stree_creat(a,2*k+2); //遞歸調(diào)用為右子賦值</p><p>  return root;//返回根節(jié)點指針</p><p><b>  } </b></p><p><b>  }

32、</b></p><p>  4.3.2先序遞歸遍歷</p><p>  void PreOrder(BiNode root){</p><p>  if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p><b>  else</b></p><p><

33、b>  { </b></p><p>  if(root->data=='0') ;</p><p><b>  else</b></p><p>  cout<<"["<<root->data<<"]";</p&g

34、t;<p>  PreOrder(root->lchild);</p><p>  PreOrder(root->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  4.3.3中序遞歸遍歷</p>

35、<p>  void InOrder(BiNode root)</p><p><b>  {</b></p><p>  if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p><b>  else</b></p><p><b>  {</

36、b></p><p>  InOrder(root->lchild);</p><p>  if(root->data=='0') ;</p><p>  else cout<<"["<<root->data<<"]";</p>&l

37、t;p>  InOrder(root->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  4.3.4后序遞歸遍歷</p><p>  void PostOrder(BiNode root)</p><

38、p><b>  {</b></p><p>  if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p><b>  else</b></p><p><b>  {</b></p><p>  PostOrder(root->lchild)

39、;</p><p>  PostOrder(root->rchild);</p><p>  if(root->data=='0') ;</p><p>  else cout<<"["<<root->data<<"]";</p><p

40、><b>  }</b></p><p><b>  }</b></p><p>  4.3.5先序非遞歸遍歷</p><p>  void F_PreOrder(BiNode root)</p><p><b>  {</b></p><p> 

41、 BiNode s[maxsize];//申請一個BiNode數(shù)組</p><p>  int top=0;//采用順序棧,并假定不會發(fā)生上溢</p><p><b>  do{</b></p><p>  while(root!=NULL)//當結點不為空時</p><p><b>  {</b>

42、</p><p>  if(root->data=='0') ;</p><p><b>  else</b></p><p>  cout<<"["<<root->data<<"]";</p><p>  s[++

43、top]=root;//依次將結點壓入棧</p><p>  root=root->lchild;//根賦值為它的左孩子</p><p><b>  }</b></p><p>  if(top>0)//當節(jié)點為空但棧頂不為零時</p><p><b>  {</b></p>

44、<p>  root=s[top--];棧頂下移把棧頂元素負給根結點</p><p>  root=root->rchild; 根賦值為它的右子</p><p><b>  }</b></p><p>  }while(root!=NULL||top>0);</p><p><b> 

45、 }</b></p><p>  4.3.6中序非遞歸遍歷</p><p>  void F_inOrder(BiNode root)</p><p><b>  {</b></p><p>  BiNode s[maxsize]; //申請一個BiNode數(shù)組</p><p> 

46、 int top=0; //采用順序棧,并假定不會發(fā)生上溢</p><p><b>  do{</b></p><p>  while(root!=NULL) //當結點不為空時</p><p><b>  {</b></p><p>  s[++top] = root; //依次將結點壓入棧<

47、;/p><p>  root = root->lchild; //根賦值為它的左孩子</p><p><b>  }</b></p><p>  if(top>0) //當節(jié)點為空但棧頂不為零時</p><p><b>  {</b></p><p>  root =

48、 s[top]; 把棧頂元素負給根結點</p><p>  if(root->data=='0') ;</p><p>  else cout<<"["<<root->data<<"]";//輸出根結點</p><p>  root=s[top--];棧頂下移

49、把棧頂元素負給根結點</p><p>  root=root->rchild; 根賦值為它的右子</p><p><b>  }</b></p><p>  }while(root!=NULL||top>0);</p><p><b>  } </b></p><p&

50、gt;  4.3.7后序非遞歸遍歷</p><p>  void F_PostOrder(BiNode root)</p><p>  {StackElemTyp s[maxsize];//申請一個StackElemType數(shù)組</p><p>  BiNode p=root;</p><p>  int top = 0;</p>

51、;<p><b>  do{</b></p><p>  while(p!=NULL) //當結點不為空時</p><p><b>  {</b></p><p>  s[top].flag = 0;//標記位負為零</p><p>  s[top].ptr = p;//將樹的結點依次

52、壓入棧中</p><p>  p=p->lchild;//樹沿左子樹下移</p><p><b>  top++;</b></p><p><b>  }</b></p><p>  while(s[top-1].flag == 1)//當棧的最上面元素標記位為一時輸出</p>

53、<p>  { if( s[top-1].ptr->data=='0') top--;</p><p><b>  else</b></p><p>  cout<<"["<<s[--top].ptr->data<<"]";</p>

54、<p><b>  }</b></p><p>  if(top>0) //當節(jié)點為空但棧頂不為零時</p><p><b>  {</b></p><p>  s[top-1].flag = 1; 棧的最上面元素標記位賦值為一</p><p>  p = s[top-1].ptr

55、; 棧的最上面元素樹結點賦給p</p><p>  p = p->rchild;樹沿右子樹下移</p><p><b>  }</b></p><p>  }while(top>0);</p><p><b>  }</b></p><p><b>  

56、4.4演示結果</b></p><p>  4.4.1二叉樹的建立</p><p>  4.4.2先序遞歸遍歷</p><p>  4.4.3中序遞歸遍歷</p><p>  4.4.4后序遞歸遍歷</p><p>  4.4.5先序非遞歸遍歷</p><p>  4.4.6中序非遞

57、歸遍歷</p><p>  4.4.7后序非遞歸遍歷</p><p><b>  5有關技術的討論</b></p><p>  5.1程序設計的優(yōu)缺點</p><p>  這個程序設計的算法清晰,思想明了,能清楚的實現(xiàn)二叉樹的建立、三種遍歷的遞歸和非遞歸運算。但是這個程序在設計過程時有些麻煩,而且三種遍歷的算法自己不是太

58、清楚,不能很清楚的描述三種遍歷。</p><p>  5.2程序設計遇到的問題</p><p>  在設計時主要三種遍歷不是很清楚,所以還是很模糊,剛開始不能很準確的把三種遍歷的算法寫出來,所以在這個問題上還要繼續(xù)思考。在寫菜單時不是很了解,后來在同學的幫助下把程序的模塊寫出來了,自己還要努力學習寫算法。</p><p><b>  6設計體會</b

59、></p><p>  通過這次做數(shù)據(jù)結構的課程設計,我發(fā)現(xiàn)真正掌握一個知識點并不只是要從書上看,還要查一些相關資料,并且理論與現(xiàn)實結合在一起。這次做的是關于二叉樹的課程設計,剛開始以為并不是很難,但真正做的時候才發(fā)現(xiàn)這一節(jié)的知識點很多,也有一些比較混淆的難點,比如二叉樹的遍歷就有三種情況,包括前序遍歷、中序遍歷、后序遍歷。</p><p>  當然這次在做課程設計的時候遇到一些問題

60、,不過得到大家的幫助,問題得到解決,也成功的完成了本次的課程設計。</p><p><b>  7結束語</b></p><p>  在二叉樹的創(chuàng)建過程中沒有利用到構造函數(shù)來直接構造一個二叉樹,這樣就不用每次創(chuàng)建一個二叉樹時候還要再重新使用一個函數(shù)來生成相關的節(jié)點。另外在棧中,釋放內(nèi)存也沒有用析構函數(shù)來完成此功能,還用了一個另外一個函數(shù),實在有點費事。</p&g

61、t;<p>  在二叉樹算法的設計中,不僅讓我更加理解了二叉樹的特點,更加讓我鍛煉了程序設計能力,并學到了一些常用的程序設計技巧,深刻明白了程序的可讀性和健壯性的重大作用。</p><p>  以下是本人在編寫此過程中的一些心得:</p><p>  1、在程序設計中,經(jīng)常沒有申請內(nèi)存就開始使用,造成了很大的錯誤。</p><p>  2、往往在一塊內(nèi)

62、存使用完了之后沒有及時釋放其內(nèi)存,雖然在這里沒有出現(xiàn)什么錯誤,但是為以后寫其他程序造成了隱患。</p><p>  3、在程序中,使用模板類方便各種數(shù)據(jù)類型都可以操作,提供了很大方便。</p><p>  4、在輸入時,采用用戶自定義空標記,方便數(shù)據(jù)的快速輸入。</p><p>  5、在非遞歸后序遍歷中只使用一個節(jié)點作為標志域,避免每一個節(jié)點都用一個標志域而申請過

63、多的內(nèi)存造成浪費。</p><p><b>  8參考文獻</b></p><p>  【1】《數(shù)據(jù)結構(C語言版)》 嚴蔚敏 吳偉民 編著 清華大學出版社</p><p>  【2】《數(shù)據(jù)結構(第二版)》 薛超英 主編 華中科技大學出版社</p><p>  【3】《數(shù)據(jù)結構題集(C語言版)》嚴蔚敏 吳偉民 編著 清華

64、大學出版社</p><p>  【4】《數(shù)據(jù)結構》 試題研究編寫組 編著 機械工業(yè)出版社</p><p>  本科生課程設計成績評定表</p><p>  班級:       姓名:       學號:</p><p>  注:最終成績以五級分制記。優(yōu)(90-100分)、良(80-89分)、中(70-79分)、</p><

65、p>  及格(60-69分)、60分以下為不及格</p><p><b>  指導教師簽名:</b></p><p><b>  年 月 日</b></p><p><b>  附:源代碼</b></p><p>  #include<iostream>

66、</p><p>  using namespace std;</p><p>  #include<stdlib.h> </p><p>  #include<math.h> </p><p>  #define maxsize 100</p><p>  #define LEN sizeof

67、(struct btree) </p><p>  int max=1;</p><p>  typedef struct btree //二叉樹節(jié)點結構體</p><p><b>  {</b></p><p>  btree *lchild,*rchild; </p><p>  char d

68、ata; </p><p>  }*BiNode; </p><p>  typedef struct StackElemType//棧的結構體</p><p><b>  {</b></p><p>  BiNode ptr;</p><p><b>  int flag;</

69、b></p><p>  }StackElemType;</p><p>  BiNode p ;</p><p><b>  //二叉樹的建立</b></p><p>  BiNode stree_creat(char *a,int k) </p><p><b>  {<

70、/b></p><p>  BiNode root; max++;</p><p>  if(a[k]=='\0'||k>maxsize) </p><p>  return NULL; //判斷樹是否為空</p><p><b>  else </b></p><p>

71、;<b>  {</b></p><p>  root=(BiNode)malloc(LEN);//動態(tài)申請節(jié)點</p><p>  root->data=a[k]; </p><p>  root->lchild=stree_creat(a,2*k+1); //遞歸調(diào)用為左孩子賦值</p><p>  ro

72、ot->rchild=stree_creat(a,2*k+2); //遞歸調(diào)用為右子賦值</p><p>  return root;//返回根節(jié)點指針</p><p><b>  } </b></p><p><b>  } </b></p><p>  void print(BiNode

73、root) //輸出所創(chuàng)建的二叉樹</p><p><b>  { </b></p><p>  BiNode h[maxsize]={NULL}; </p><p>  int top=0,base=0,j=0,k=0,n=0,m=0; </p><p>  h[top]=root;</p><p&

74、gt;  j=log(max+1)/log(2)-1;</p><p>  if(pow(2,j+1)-1<max) j++;</p><p>  cout<<"你剛輸入的是:\n"; </p><p>  while(h[base]!=NULL) //把二叉樹的值依次存入數(shù)組</p><p><b

75、>  { </b></p><p>  h[++top]=h[base]->lchild; </p><p>  h[++top]=h[base]->rchild; </p><p><b>  base++; </b></p><p><b>  } </b><

76、/p><p>  for(top=0;h[k]!=NULL;top++)//按層輸出</p><p><b>  { </b></p><p>  m=pow(2,j)-top;//計算每行輸出的空格數(shù)</p><p>  if(top!=0) m=m-top;</p><p>  for(n=0;n

77、<m;n++) </p><p>  cout<<" ";</p><p>  for(base=0;base<pow(2,top)&&h[k]!=NULL;base++)//控制每層輸出的個數(shù)</p><p><b>  {</b></p><p>  if(

78、h[k]->data=='0') cout<<"["<<"]";//當為空時輸出[]</p><p>  else cout<<h[k]->data<<" ";</p><p><b>  k++;</b></p>&l

79、t;p><b>  }</b></p><p>  cout<<"\n";</p><p>  for(n=0;n<(m-1);n++) </p><p>  cout<<" ";</p><p>  for(base=0;base<pow

80、(2,top)&&h[k]!=NULL;base++)</p><p>  cout<<"/"<<"| "; </p><p>  cout<<"\n";</p><p><b>  } </b></p><p&g

81、t;<b>  } </b></p><p>  //二叉樹的后序遍歷遞歸算法</p><p>  void PostOrder(BiNode root)</p><p><b>  {</b></p><p>  if(root==NULL)return;//遞歸調(diào)用的約束條件</p>

82、<p><b>  else</b></p><p><b>  {</b></p><p>  PostOrder(root->lchild);</p><p>  PostOrder(root->rchild);</p><p>  if(root->data==

83、'0') ;</p><p>  else cout<<"["<<root->data<<"]";</p><p><b>  }</b></p><p><b>  }</b></p><p>  

84、//二叉樹的中序遍歷遞歸算法</p><p>  void InOrder(BiNode root)</p><p><b>  {</b></p><p>  if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p><b>  else</b></p>&l

85、t;p><b>  {</b></p><p>  InOrder(root->lchild);</p><p>  if(root->data=='0') ;</p><p>  else cout<<"["<<root->data<<&quo

86、t;]";</p><p>  InOrder(root->rchild);</p><p><b>  }</b></p><p><b>  }</b></p><p>  //二叉樹的前序遞歸遍歷算法</p><p>  void PreOrder(Bi

87、Node root){</p><p>  if(root==NULL)return;//遞歸調(diào)用的約束條件</p><p><b>  else</b></p><p><b>  { </b></p><p>  if(root->data=='0') ;</p&g

88、t;<p><b>  else</b></p><p>  cout<<"["<<root->data<<"]";</p><p>  PreOrder(root->lchild);</p><p>  PreOrder(root->r

89、child);</p><p><b>  }</b></p><p><b>  }</b></p><p>  //二叉樹的前序遍歷非遞歸算法 </p><p>  void F_PreOrder(BiNode root)</p><p><b>  {<

90、/b></p><p>  BiNode s[maxsize];//申請一個BiNode數(shù)組</p><p>  int top=0;//采用順序棧,并假定不會發(fā)生上溢</p><p><b>  do{</b></p><p>  while(root!=NULL)//當結點不為空時</p><

91、;p><b>  {</b></p><p>  if(root->data=='0') ;</p><p><b>  else</b></p><p>  cout<<"["<<root->data<<"]"

92、;</p><p>  s[++top]=root;//依次將結點壓入棧</p><p>  root=root->lchild;//根賦值為它的左孩子</p><p><b>  }</b></p><p>  if(top>0)//當節(jié)點為空但棧頂不為零時</p><p><

93、b>  {</b></p><p>  root=s[top--];//棧頂下移把棧頂元素負給根結點</p><p>  root=root->rchild; //根賦值為它的右子</p><p><b>  }</b></p><p>  }while(root!=NULL||top>0)

94、;</p><p><b>  }</b></p><p>  //中序非遞歸遍歷算法</p><p>  void F_inOrder(BiNode root)</p><p><b>  {</b></p><p>  BiNode s[maxsize]; //申請一

95、個BiNode數(shù)組</p><p>  int top=0; //采用順序棧,并假定不會發(fā)生上溢</p><p><b>  do{</b></p><p>  while(root!=NULL) //當結點不為空時</p><p><b>  {</b></p><p> 

96、 s[++top] = root; //依次將結點壓入棧</p><p>  root = root->lchild; //根賦值為它的左孩子</p><p><b>  }</b></p><p>  if(top>0) //當節(jié)點為空但棧頂不為零時</p><p><b>  {</b&g

97、t;</p><p>  root = s[top]; //把棧頂元素負給根結點</p><p>  if(root->data=='0') ;</p><p>  else cout<<"["<<root->data<<"]";//輸出根結點</p&g

98、t;<p>  root=s[top--];//棧頂下移把棧頂元素負給根結點</p><p>  root=root->rchild; //根賦值為它的右子</p><p><b>  }</b></p><p>  }while(root!=NULL||top>0);</p><p><

99、b>  } </b></p><p>  //后序非遞歸遍歷算法</p><p>  typedef struct </p><p><b>  {</b></p><p>  BiNode ptr;</p><p><b>  int flag;</b>&

100、lt;/p><p>  }StackElemTyp;</p><p>  void F_PostOrder(BiNode root)</p><p><b>  {</b></p><p>  StackElemTyp s[maxsize];//申請一個StackElemType數(shù)組</p><p>

101、;  BiNode p=root;</p><p>  int top = 0;</p><p><b>  do{</b></p><p>  while(p!=NULL) //當結點不為空時</p><p><b>  {</b></p><p>  s[top].fla

102、g = 0;//標記位負為零</p><p>  s[top].ptr = p;//將樹的結點依次壓入棧中</p><p>  p=p->lchild;//樹沿左子樹下移</p><p><b>  top++;</b></p><p><b>  }</b></p><p

103、>  while(s[top-1].flag == 1)//當棧的最上面元素標記位為一時輸出</p><p>  { if( s[top-1].ptr->data=='0') top--;</p><p><b>  else</b></p><p>  cout<<"["&

104、lt;<s[--top].ptr->data<<"]";</p><p><b>  }</b></p><p>  if(top>0) //當節(jié)點為空但棧頂不為零時</p><p><b>  {</b></p><p>  s[top-1].fl

105、ag = 1;// 棧的最上面元素標記位賦值為一</p><p>  p = s[top-1].ptr; //棧的最上面元素樹結點賦給p</p><p>  p = p->rchild;//樹沿右子樹下移</p><p><b>  }</b></p><p>  }while(top>0);</p&g

106、t;<p><b>  }</b></p><p>  //輸入二叉樹信息的函數(shù)</p><p>  BiNode creat()</p><p><b>  { </b></p><p>  BiNode p=NULL ;</p><p>  cout<

107、<"請輸入你的二叉樹(請按層次由上往下從左到右依次輸入并按#結束,如果節(jié)點為空請輸入'0',本遍歷器僅支持單字符),輸入為:\n";</p><p>  int i=0,j=0; </p><p>  char b[maxsize]={'#'},n ;</p><p>  //當輸入不為'#'

108、時給數(shù)組賦值</p><p><b>  do{ </b></p><p><b>  cin>>n;</b></p><p>  if(n!='#') b[i]=n;</p><p><b>  i++;</b></p><p

109、>  }while(n!='#');</p><p>  p=stree_creat(b,0);//創(chuàng)建樹</p><p>  print(p);//輸出樹</p><p><b>  return p;</b></p><p><b>  }</b></p>&

110、lt;p><b>  //主函數(shù)</b></p><p>  int main()</p><p><b>  {</b></p><p><b>  int k;</b></p><p>  cout<<"\n ";</p>

111、;<p>  cout<<"\n ____________________________________________________________________________ ";</p><p>  cout<<" | 歡迎使用樹的多種遍歷器

112、 |";</p><p>  cout<<" | |";</p><p>  cout<<" |________________________________

113、____________________________________________| \n";</p><p><b>  do{</b></p><p>  cout<<"\n ";</p><p>  cout<<"\n 1.

114、創(chuàng)建二叉樹 ";</p><p>  cout<<"\n 2.前序遞歸遍歷算法 ";</p><p>  cout<<"\n 3.中序遞歸遍歷算法 ";</p><p>  cout<<&q

115、uot;\n 4.后序遞歸遍歷算法 ";</p><p>  cout<<"\n 5.前序非遞歸遍歷算法 ";</p><p>  cout<<"\n 6.中序非遞歸遍歷算法 ";

116、</p><p>  cout<<"\n 7.后序非遞歸遍歷算法 "; </p><p>  cout<<"\n 8.退出操作\n";</p><p>  cout<<"請選擇你要進行的操作

117、(數(shù)字鍵):";</p><p><b>  cin>>k; </b></p><p>  switch(k){</p><p><b>  case 1:{</b></p><p>  p=creat();//調(diào)用creat()創(chuàng)建二叉樹</p><p&

118、gt;<b>  }break;</b></p><p><b>  case 2:{</b></p><p>  cout<<"二叉樹的前序遞歸遍歷 :";</p><p>  PreOrder(p);//調(diào)用PreOrder(p)前序遍歷</p><p><

119、b>  } break; </b></p><p><b>  case 3:{</b></p><p>  cout<<"二叉樹的中序遞歸遍歷 :";</p><p>  InOrder(p); //調(diào)用InOrder(p)中序遍歷</p><p><b> 

120、 } break;</b></p><p><b>  case 4:{</b></p><p>  cout<<"二叉樹的后序遞歸遍歷 :";</p><p>  PostOrder(p); //調(diào)用PostOrder(p) 后序遍歷</p><p><b>  }

121、 break;</b></p><p><b>  case 5:{</b></p><p>  cout<<"二叉樹前序非遞歸遍歷:";</p><p>  F_PreOrder(p); //調(diào)用F_PreOrder(p)前序遍歷</p><p><b>  }br

122、eak;</b></p><p><b>  case 6:{</b></p><p>  cout<<"二叉樹中序非遞歸遍歷:";</p><p>  F_inOrder(p); //調(diào)用F_inOrder(p) 中序遍歷</p><p><b>  }break;

123、</b></p><p><b>  case 7:{</b></p><p>  cout<<"二叉樹后序非遞歸遍歷:";</p><p>  F_PostOrder(p);</p><p><b>  }break;</b></p>&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

提交評論