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

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p><b>  課程設(shè)計說明書</b></p><p>  題目: 遍歷二叉樹     </p><p>  院 系: 計算機科學(xué)與工程系 </p><p>  2010年6月25日</p><

2、;p><b>  目 錄</b></p><p><b>  一、需求分析2</b></p><p>  1.主功能模塊2</p><p>  2.創(chuàng)建樹模塊2</p><p>  3.遍歷樹模塊2</p><p><b>  二、概要設(shè)

3、計3</b></p><p><b>  1.功能設(shè)計3</b></p><p> ?。?)創(chuàng)建二叉樹3</p><p> ?。?)先序遞歸遍歷3</p><p>  (3)中序遞歸遍歷3</p><p> ?。?)后序遞歸遍歷3</p><p

4、> ?。?)先序非遞歸遍歷3</p><p>  (6)中序非遞歸遍歷4</p><p> ?。?)后序非遞歸遍歷4</p><p>  (8)層序非遞歸遍歷4</p><p>  2.算法流程圖4</p><p>  三、詳細(xì)設(shè)計12</p><p>  1.界

5、面設(shè)計12</p><p>  2.詳細(xì)代碼分析14</p><p> ?。?)主模塊14</p><p>  (2)創(chuàng)建樹模塊15</p><p> ?。?)遍歷樹模塊16</p><p>  (4)源程序清單16</p><p>  3.調(diào)試分析35</p&g

6、t;<p>  (1)調(diào)試結(jié)果35</p><p> ?。?)算法分析36</p><p>  四、心得體會37</p><p>  五、參考文獻(xiàn)38</p><p><b>  需求分析</b></p><p>  在現(xiàn)實世界層次化的數(shù)據(jù)模型中,數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系

7、紛繁復(fù)雜。其中很多關(guān)系無法使用簡單的線性結(jié)構(gòu)表示清楚,比如祖先與后代的關(guān)系、整體與部分的關(guān)系等。于是人們借鑒自然界中樹的形象創(chuàng)造了一種強大的非線性結(jié)構(gòu)——樹。樹形結(jié)構(gòu)的具體形式有很多種,其中最常用的就是二叉樹。而二叉樹的多層次遍歷遍歷則是二叉樹的重要內(nèi)容。</p><p>  本程序用Microsoft Visual C++ 6.0編寫,可以實現(xiàn)對二叉樹的多種方式的創(chuàng)建、采用遞歸和非遞歸等兩種方式先序、中序、后序

8、進(jìn)行遍歷。</p><p><b>  主功能模塊</b></p><p>  通過合理的界面設(shè)計,根據(jù)提示信息,使用者可以方便快捷地運行本程序來完成創(chuàng)建、遍歷二叉樹等操作。界面美觀,人性化,程序智能,安全性高。</p><p><b>  創(chuàng)建樹模塊</b></p><p>  當(dāng)進(jìn)入程序運行界面

9、后,根據(jù)提示輸入需要建立的二叉樹,共有三種方法來創(chuàng)建二叉樹,即:1:廣義表構(gòu)造法、2:先序和中序構(gòu)造法、3:中序和后序構(gòu)造法。建立完二叉樹后自動進(jìn)入下一個功能模塊。</p><p><b>  遍歷樹模塊</b></p><p>  實現(xiàn)對該二叉樹的先序遞歸遍歷、先序非遞歸遍歷、中序遞歸遍歷、中序非遞歸遍歷、后序遞歸遍歷、后序非遞歸遍歷、層序非遞歸遍歷等方式的遍歷操作

10、,并輸出各遍歷序列。當(dāng)對該二叉樹進(jìn)行層序非遞歸遍歷時,直接輸出該樹的邏輯結(jié)構(gòu)圖,以便更直觀地顯示其層次關(guān)系。</p><p><b>  概要設(shè)計</b></p><p><b>  功能設(shè)計</b></p><p><b>  創(chuàng)建二叉樹</b></p><p>  利用二叉

11、樹模板類,創(chuàng)建二叉樹時產(chǎn)生類模板,調(diào)用類的構(gòu)造函數(shù)來創(chuàng)建,修改二叉樹的結(jié)構(gòu)時,可以調(diào)用賦值語句直接把廣義表轉(zhuǎn)換成二叉樹。相關(guān)類或函數(shù)如下:</p><p>  class BinaryTree;</p><p>  BinaryTree();</p><p>  BinaryTree<T>& operator=(const string&

12、 str);</p><p><b>  先序遞歸遍歷</b></p><p>  若二叉樹為空,則空操作;否則(1)訪問根結(jié)點;(2)先序遍歷左子樹;(3)先序遍歷右子樹。相關(guān)函數(shù)如下:</p><p>  void PreOrderTraverse(const BinaryTreeNode<T>* p) const;</p

13、><p><b>  中序遞歸遍歷</b></p><p>  若二叉樹為空,則空操作;否則(1)中序遍歷左子樹;(2)訪問根結(jié)點;(3)中序遍歷右子樹。相關(guān)函數(shù)如下:</p><p>  void InOrderTraverse(const BinaryTreeNode<T>* p) const;</p><p&g

14、t;<b>  后序遞歸遍歷</b></p><p>  若二叉樹為空,則空操作;否則(1)后序遍歷左子樹;(2)后序遍歷右子樹;(3)訪問根結(jié)點。相關(guān)函數(shù)如下:</p><p>  void PostOrderTraverse(const BinaryTreeNode<T>* p) const;</p><p><b>

15、  先序非遞歸遍歷</b></p><p>  若二叉樹為空,則空操作;否則引入棧模擬遞歸工作棧,初始時棧為空。相關(guān)函數(shù)如下:</p><p>  void PreOrderTraverse() const;</p><p><b>  中序非遞歸遍歷</b></p><p>  若二叉樹為空,則空操作;否則

16、引入棧模擬遞歸工作棧,初始時棧為空。相關(guān)函數(shù)如下:</p><p>  void InOrderTraverse() const;</p><p><b>  后序非遞歸遍歷</b></p><p>  若二叉樹為空,則空操作;否則引入棧和標(biāo)記模擬遞歸工作棧,初始時棧為空。相關(guān)函數(shù)如下:</p><p>  void P

17、ostOrderTraverse() const;</p><p><b>  層序非遞歸遍歷</b></p><p>  按照樹的層次從左到右訪問樹的結(jié)點,層序遍歷用于保存結(jié)點的容器是隊列。相關(guān)函數(shù)如下:</p><p>  void LevelOrderTraverse() const;</p><p><b&

18、gt;  算法流程圖</b></p><p>  圖2-1 創(chuàng)建而二叉樹</p><p>  圖2-2 前序遞歸遍歷</p><p>  圖2-3 中序遞歸遍歷</p><p>  圖2-4 后序遞歸遍歷</p><p>  圖2-5 先序非遞歸遍歷</p><p>  圖

19、2-6 中序非遞歸遍歷</p><p>  圖2-7 后序非遞歸遍歷</p><p>  圖2-8 層序非遞歸遍歷</p><p><b>  詳細(xì)設(shè)計</b></p><p><b>  界面設(shè)計</b></p><p>  圖3-1 系統(tǒng)運行主界面</p&g

20、t;<p>  圖3-2 創(chuàng)建二叉樹界面</p><p>  圖3-3 某二叉樹層序遍歷界面</p><p><b>  詳細(xì)代碼分析</b></p><p><b>  主模塊</b></p><p>  本模塊定義了系統(tǒng)運行主界面的相關(guān)內(nèi)容和相關(guān)操作函數(shù),源代碼如下:</

21、p><p>  int main()</p><p><b>  {</b></p><p>  system("color A9"); //設(shè)置屏幕背景和字體顏色</p><p>  cout<<endl<<endl<<endl<<endl<

22、;<endl;</p><p>  cout<<string(35,'*')<<"遍歷二叉樹"<<string(35,'*')<<endl;</p><p>  cout<<string(31,' ')<<"1:創(chuàng)建二叉樹"&

23、lt;<endl;</p><p>  cout<<string(31,' ')<<"2:先序遍歷(遞歸)"<<endl;</p><p>  cout<<string(31,' ')<<"3:先序遍歷(非遞歸)"<<endl;</p&

24、gt;<p>  cout<<string(31,' ')<<"4:中序遍歷(遞歸)"<<endl;</p><p>  cout<<string(31,' ')<<"5:中序遍歷(非遞歸)"<<endl;</p><p>  cou

25、t<<string(31,' ')<<"6:后序遍歷(遞歸)"<<endl;</p><p>  cout<<string(31,' ')<<"7:后序遍歷(非遞歸)"<<endl;</p><p>  cout<<string(31,

26、' ')<<"8:層序遍歷(非遞歸)"<<endl;</p><p>  cout<<string(31,' ')<<"9:重新顯示所有菜單"<<endl;</p><p>  cout<<string(31,' ')<<

27、;"0:關(guān)閉窗口";</p><p>  if(second>=0)</p><p><b>  {</b></p><p>  cout<<"(剩"<<setw(2)<<second<<"秒)";</p><p

28、><b>  }</b></p><p>  cout<<endl<<endl<<string(80,'*');while(!isdigit(ch)) //合法性判斷</p><p><b>  {</b></p><p>  center("

29、您的輸入有誤,請重新輸入:",0);</p><p>  ch=getch();</p><p>  cout<<ch<<endl;</p><p><b>  }</b></p><p>  BinaryTree<char> t; //構(gòu)造空二叉樹</p&g

30、t;<p>  while(1) //菜單操作無限循環(huán)</p><p><b>  {</b></p><p>  bool mark=1; //設(shè)置重新顯示所有菜單時的輸出標(biāo)記</p><p>  switch(ch)</p><p><b>  {...}</b>

31、;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  創(chuàng)建樹模塊</b></p><p>  本模塊包括兩個類——二叉樹結(jié)點類、二叉樹類,源代碼如下:</p><p>  class Binary

32、TreeNode</p><p><b>  {</b></p><p><b>  private:</b></p><p>  T data; //存儲該結(jié)點的數(shù)據(jù)</p><p>  BinaryTreeNode<T> *parent; //存

33、儲該結(jié)點的父指針</p><p>  BinaryTreeNode<T> *left; //存儲該結(jié)點的左孩子指針</p><p>  BinaryTreeNode<T> *right; //存儲該結(jié)點的右孩子指針</p><p><b>  public:</b></p><p>  Bi

34、naryTreeNode();</p><p>  BinaryTreeNode(const T& t);</p><p>  T GetData() const;</p><p>  bool IsLeftChild() const;</p><p>  bool IsRightChild() const;</p>&

35、lt;p>  BinaryTreeNode<T>* GetParent() const;</p><p>  BinaryTreeNode<T>* GetLeftChild() const;</p><p>  BinaryTreeNode<T>* GetRightChild() const;</p><p>  Binar

36、yTreeNode<T>* GetLeftBrother() const;</p><p>  BinaryTreeNode<T>* GetRightBrother() const;</p><p>  void Assign(const T& t);</p><p>  void SetParent(BinaryTreeNode&l

37、t;T>* q);</p><p>  void SetLeftChild(BinaryTreeNode<T>* q);</p><p>  void SetRightChild(BinaryTreeNode<T>* q);</p><p>  ~BinaryTreeNode();</p><p><b&g

38、t;  };</b></p><p>  class BinaryTree</p><p><b>  {</b></p><p><b>  private:</b></p><p>  BinaryTreeNode<T>* root; //二叉樹根節(jié)點</p>

39、;<p><b>  public:</b></p><p>  BinaryTree(); //二叉樹構(gòu)造函數(shù)聲明</p><p>  bool IsEmpty() const; //二叉樹判空函數(shù)聲明</p><p>  BinaryTreeNode<T>* GetRoot() const;

40、 //取得根節(jié)點函數(shù)聲明</p><p>  BinaryTree<T>& operator=(const string& str); //二叉樹賦值函數(shù)聲明</p><p>  ~BinaryTree(); //二叉樹析構(gòu)函數(shù)聲明</p><p><b>  private:</b></p>&

41、lt;p>  void NodeCounter(const BinaryTreeNode<T>* p,int& sum) const; //統(tǒng)計二叉樹結(jié)點個數(shù)函數(shù)聲明</p><p>  void Destroy(BinaryTreeNode<T>* p); //二叉樹級聯(lián)釋放結(jié)點內(nèi)存函數(shù)聲明</p><p>  int Depth(const B

42、inaryTreeNode<T>* p) const; //計算二叉樹深度函數(shù)聲明</p><p><b>  };</b></p><p><b>  遍歷樹模塊</b></p><p>  本模塊包括了各種遍歷二叉樹的函數(shù),源代碼如下:</p><p>  void LevelOr

43、derTraverse() const; //二叉樹的層序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void PreOrderTraverse() const; //二叉樹的先序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void PreOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉樹的先序遍歷(遞歸)

44、成員函數(shù)聲明</p><p>  void InOrderTraverse() const; //二叉樹的中序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void InOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉樹的中序遍歷(遞歸)成員函數(shù)聲明</p><p>  void PostO

45、rderTraverse() const; //二叉樹的后序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void PostOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉樹的后序遍歷(非遞歸)成員函數(shù)聲明</p><p><b>  源程序清單</b></p><p>

46、  BinaryTreeNode.h</p><p>  #include<cassert></p><p>  #include<string></p><p>  #include<stack></p><p>  template<class T></p><p>

47、  class BinaryTreeNode</p><p><b>  {</b></p><p><b>  private:</b></p><p>  T data; //存儲該結(jié)點的數(shù)據(jù)</p><p>  BinaryTreeNode<T>

48、; *parent; //存儲該結(jié)點的父指針</p><p>  BinaryTreeNode<T> *left; //存儲該結(jié)點的左孩子指針</p><p>  BinaryTreeNode<T> *right; //存儲該結(jié)點的右孩子指針</p><p><b>  public:</b></p>

49、<p>  BinaryTreeNode();</p><p>  BinaryTreeNode(const T& t);</p><p>  T GetData() const;</p><p>  bool IsLeftChild() const;</p><p>  bool IsRightChild() const

50、;</p><p>  BinaryTreeNode<T>* GetParent() const;</p><p>  BinaryTreeNode<T>* GetLeftChild() const;</p><p>  BinaryTreeNode<T>* GetRightChild() const;</p>&l

51、t;p>  BinaryTreeNode<T>* GetLeftBrother() const;</p><p>  BinaryTreeNode<T>* GetRightBrother() const;</p><p>  void Assign(const T& t);</p><p>  void SetParent(Bi

52、naryTreeNode<T>* q);</p><p>  void SetLeftChild(BinaryTreeNode<T>* q);</p><p>  void SetRightChild(BinaryTreeNode<T>* q);</p><p>  ~BinaryTreeNode();</p>&l

53、t;p><b>  };</b></p><p>  template<class T></p><p>  BinaryTreeNode<T>::BinaryTreeNode():data(0),parent(NULL),left(NULL),right(NULL){}</p><p>  template<

54、;class T></p><p>  BinaryTreeNode<T>::BinaryTreeNode(const T&t):data(t),parent(NULL),left(NULL),right(NULL){}</p><p>  template<class T></p><p>  bool BinaryTreeN

55、ode<T>::IsLeftChild() const</p><p><b>  {</b></p><p>  return (this==this->parent->GetLeftChild());</p><p><b>  }</b></p><p>  templ

56、ate<class T></p><p>  bool BinaryTreeNode<T>::IsRightChild() const</p><p><b>  {</b></p><p>  return (this==this->parent->GetRightChild());</p>

57、<p><b>  }</b></p><p>  template<class T></p><p>  T BinaryTreeNode<T>::GetData() const</p><p><b>  {</b></p><p>  return data;

58、</p><p><b>  }</b></p><p>  template<class T></p><p>  BinaryTreeNode<T>* BinaryTreeNode<T>::GetParent() const</p><p><b>  {</b&g

59、t;</p><p>  return parent;</p><p><b>  }</b></p><p>  template<class T></p><p>  BinaryTreeNode<T>* BinaryTreeNode<T>::GetLeftChild() cons

60、t</p><p><b>  {</b></p><p>  return left;</p><p><b>  }</b></p><p>  template<class T></p><p>  BinaryTreeNode<T>* Bina

61、ryTreeNode<T>::GetRightChild() const</p><p><b>  {</b></p><p>  return right;</p><p><b>  }</b></p><p>  template<class T></p>

62、<p>  BinaryTreeNode<T>* BinaryTreeNode<T>::GetLeftBrother() const</p><p><b>  {</b></p><p>  assert(IsRightChild());</p><p>  return this->parent-

63、>GetLeftChild();</p><p><b>  }</b></p><p>  template<class T></p><p>  BinaryTreeNode<T>* BinaryTreeNode<T>::GetRightBrother() const</p><

64、p><b>  {</b></p><p>  assert(IsLeftChild());</p><p>  return this->parent->GetRightChild();</p><p><b>  }</b></p><p>  template<clas

65、s T></p><p>  void BinaryTreeNode<T>::Assign(const T& t)</p><p><b>  {</b></p><p><b>  data=t;</b></p><p><b>  }</b><

66、;/p><p>  template<class T></p><p>  void BinaryTreeNode<T>::SetParent(BinaryTreeNode<T>* q)</p><p><b>  {</b></p><p><b>  parent=q;<

67、;/b></p><p><b>  }</b></p><p>  template<class T></p><p>  void BinaryTreeNode<T>::SetLeftChild(BinaryTreeNode<T>* q)</p><p><b> 

68、 {</b></p><p><b>  left=q;</b></p><p><b>  }</b></p><p>  template<class T></p><p>  void BinaryTreeNode<T>::SetRightChild(Bin

69、aryTreeNode<T>* q)</p><p><b>  {</b></p><p><b>  right=q;</b></p><p><b>  }</b></p><p>  template<class T></p>&l

70、t;p>  BinaryTreeNode<T>::~BinaryTreeNode(){}</p><p>  BinaryTree.h</p><p>  #include<iostream></p><p>  #include<cmath></p><p>  #include<vector

71、></p><p>  #include<stack></p><p>  #include<queue></p><p>  #include"BinaryTreeNode.h" //二叉樹結(jié)點模板類頭文件</p><p>  using namespace std;</p>

72、<p>  const int MAX=1024;</p><p>  template<class T></p><p>  class BinaryTree</p><p><b>  {</b></p><p><b>  private:</b></p>

73、<p>  BinaryTreeNode<T>* root; //二叉樹根節(jié)點</p><p><b>  public:</b></p><p>  BinaryTree(); //二叉樹構(gòu)造函數(shù)聲明</p><p>  bool IsEmpty() const; //二叉樹判空函數(shù)聲明<

74、/p><p>  BinaryTreeNode<T>* GetRoot() const; //取得根節(jié)點函數(shù)聲明</p><p>  BinaryTree<T>& operator=(const string& str); //二叉樹賦值函數(shù)聲明</p><p>  void LevelOrderTraverse() cons

75、t; //二叉樹的層序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void PreOrderTraverse() const; //二叉樹的先序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void PreOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉樹的先序遍歷(遞歸)成員函數(shù)聲明</p>

76、<p>  void InOrderTraverse() const; //二叉樹的中序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void InOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉樹的中序遍歷(遞歸)成員函數(shù)聲明</p><p>  void PostOrderTraverse() con

77、st; //二叉樹的后序遍歷(非遞歸)成員函數(shù)聲明</p><p>  void PostOrderTraverse(const BinaryTreeNode<T>* p) const; //二叉樹的后序遍歷(非遞歸)成員函數(shù)聲明</p><p>  ~BinaryTree(); //二叉樹析構(gòu)函數(shù)聲明</p><p><b>  pri

78、vate:</b></p><p>  void NodeCounter(const BinaryTreeNode<T>* p,int& sum) const; //統(tǒng)計二叉樹結(jié)點個數(shù)函數(shù)聲明</p><p>  void Destroy(BinaryTreeNode<T>* p); //二叉樹級聯(lián)釋放結(jié)點內(nèi)存函數(shù)聲明</p>

79、<p>  int Depth(const BinaryTreeNode<T>* p) const; //計算二叉樹深度函數(shù)聲明</p><p><b>  };</b></p><p>  template<class T></p><p>  BinaryTree<T>::BinaryTree

80、():root(NULL){} //二叉樹構(gòu)造函數(shù)定義</p><p>  template<class T></p><p>  BinaryTree<T>& BinaryTree<T>::operator=(const string& str) //二叉樹賦值函數(shù)定義</p><p><b>  {

81、</b></p><p>  Destroy(root);</p><p>  root=NULL;</p><p>  BinaryTreeNode<T> *index[MAX];</p><p>  BinaryTreeNode<T> *p=NULL;</p><p>  int

82、 top=-1,sum=0,number=0;</p><p>  int mark=1;</p><p>  for(int i=0;i<str.size();i++)</p><p><b>  {</b></p><p>  char ch=str[i];</p><p>  swit

83、ch(ch)</p><p><b>  {</b></p><p><b>  case '(':</b></p><p><b>  {</b></p><p>  index[++top]=p;</p><p><b> 

84、 mark=1;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case ')':</b></p><p><b>  {</b></p>

85、;<p><b>  mark=1;</b></p><p><b>  top--;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case '

86、;,':</b></p><p><b>  {</b></p><p><b>  mark++;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p&g

87、t;<b>  default:</b></p><p><b>  {</b></p><p>  p=new BinaryTreeNode<T>(ch);</p><p><b>  sum++;</b></p><p>  if(root==NULL)<

88、/p><p><b>  {</b></p><p><b>  root=p;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b>

89、</p><p>  if(mark==1)</p><p><b>  {</b></p><p>  index[top]->SetLeftChild(p);</p><p><b>  }</b></p><p>  else if(mark==2)</p&

90、gt;<p><b>  {</b></p><p>  index[top]->SetRightChild(p);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

91、</p><p><b>  }</b></p><p><b>  }</b></p><p>  NodeCounter(root,number);</p><p>  if(sum>number)</p><p><b>  {</b><

92、;/p><p>  Destroy(root);</p><p>  root=NULL;</p><p><b>  }</b></p><p>  return *this;</p><p><b>  }</b></p><p>  template

93、<class T></p><p>  bool BinaryTree<T>::IsEmpty() const //二叉樹判空函數(shù)定義</p><p><b>  {</b></p><p>  return (root==NULL);</p><p><b>  }</b>

94、;</p><p>  template<class T></p><p>  BinaryTreeNode<T>* BinaryTree<T>::GetRoot() const //取得根節(jié)點函數(shù)定義</p><p><b>  {</b></p><p>  return root

95、;</p><p><b>  }</b></p><p>  template<class T></p><p>  void BinaryTree<T>::LevelOrderTraverse() const //二叉樹的層序遍歷(非遞歸)成員函數(shù)定義</p><p><b>  

96、{</b></p><p>  if(root==NULL)</p><p><b>  {</b></p><p>  cout<<string(15,' ')<<"二叉樹為空,請先創(chuàng)建二叉樹! "<<endl;</p><p><

97、;b>  return;</b></p><p><b>  }</b></p><p>  int sum=Depth(root);</p><p>  queue<BinaryTreeNode<T> *> list;</p><p>  list.push(root);<

98、;/p><p>  BinaryTreeNode<T> *p=new BinaryTreeNode<T>(' ');</p><p>  int number=1;</p><p>  while(number<=pow(2,sum)-1)</p><p><b>  {</b>

99、</p><p>  BinaryTreeNode<T>* temp=list.front();</p><p>  list.pop();</p><p>  int i=floor(log10(number)/log10(2))+1;</p><p>  int j=number+1-pow(2,i-1);</p>

100、<p>  if(number==pow(2,i-1))</p><p><b>  {</b></p><p>  cout<<string((81-pow(2,sum))/2+pow(2,sum-i)-1,' ');</p><p><b>  }</b></p>

101、<p><b>  else</b></p><p><b>  {</b></p><p>  cout<<string(pow(2,sum-i+1)-1,' ');</p><p><b>  }</b></p><p>  cout

102、<<temp->GetData();</p><p>  if(floor(log10(number+1)/log10(2))==log10(number+1)/log10(2))</p><p><b>  {</b></p><p>  cout<<endl;</p><p><b

103、>  }</b></p><p><b>  number++;</b></p><p>  if(temp->GetLeftChild()!=NULL)</p><p><b>  {</b></p><p>  list.push(temp->GetLeftChil

104、d());</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  list.push(p);</p><p><b>  }</b><

105、/p><p>  if(temp->GetRightChild()!=NULL)</p><p><b>  {</b></p><p>  list.push(temp->GetRightChild());</p><p><b>  }</b></p><p>&

106、lt;b>  else</b></p><p><b>  {</b></p><p>  list.push(p);</p><p><b>  }</b></p><p><b>  }</b></p><p><b> 

107、 delete p;</b></p><p><b>  }</b></p><p>  template<class T></p><p>  void BinaryTree<T>::PreOrderTraverse(const BinaryTreeNode<T>* p) const //二叉

108、樹的先序遍歷(遞歸)成員函數(shù)定義</p><p><b>  {</b></p><p>  if(root==NULL)</p><p><b>  {</b></p><p>  cout<<"二叉樹為空,請先創(chuàng)建二叉樹!";</p><p&g

109、t;<b>  return;</b></p><p><b>  }</b></p><p>  if(p==NULL)</p><p><b>  {</b></p><p><b>  return;</b></p><p>

110、<b>  }</b></p><p>  cout<<p->GetData();</p><p>  PreOrderTraverse(p->GetLeftChild());</p><p>  PreOrderTraverse(p->GetRightChild());</p><p>&

111、lt;b>  }</b></p><p>  template<class T></p><p>  void BinaryTree<T>::PreOrderTraverse() const //二叉樹的先序遍歷(非遞歸)成員函數(shù)定義</p><p><b>  {</b></p>&l

112、t;p>  if(root==NULL)</p><p><b>  {</b></p><p>  cout<<"二叉樹為空,請先創(chuàng)建二叉樹!";</p><p><b>  return;</b></p><p><b>  }</b>

113、</p><p>  stack<BinaryTreeNode<T> *> list;</p><p>  BinaryTreeNode<T> *p=root;</p><p>  while(!list.empty() || p!=NULL)</p><p><b>  {</b>&

114、lt;/p><p>  while(p!=NULL)</p><p><b>  {</b></p><p>  list.push(p);</p><p>  cout<<p->GetData();</p><p>  p=p->GetLeftChild();</p&g

115、t;<p><b>  }</b></p><p>  p=list.top();</p><p>  list.pop();</p><p>  p=p->GetRightChild();</p><p><b>  }</b></p><p><

116、b>  }</b></p><p>  template<class T></p><p>  void BinaryTree<T>::InOrderTraverse(const BinaryTreeNode<T>* p) const //二叉樹的中序遍歷(遞歸)成員函數(shù)定義</p><p><b> 

117、 {</b></p><p>  if(root==NULL)</p><p><b>  {</b></p><p>  cout<<"二叉樹為空,請先創(chuàng)建二叉樹!";</p><p><b>  return;</b></p><p

118、><b>  }</b></p><p>  if(p==NULL)</p><p><b>  {</b></p><p><b>  return;</b></p><p><b>  }</b></p><p>  In

119、OrderTraverse(p->GetLeftChild());</p><p>  cout<<p->GetData();</p><p>  InOrderTraverse(p->GetRightChild());</p><p><b>  }</b></p><p>  templ

120、ate<class T></p><p>  void BinaryTree<T>::InOrderTraverse() const //二叉樹的中序遍歷(非遞歸)成員函數(shù)定義</p><p><b>  {</b></p><p>  if(root==NULL)</p><p><b&

121、gt;  {</b></p><p>  cout<<"二叉樹為空,請先創(chuàng)建二叉樹!";</p><p><b>  return;</b></p><p><b>  }</b></p><p>  stack<BinaryTreeNode<

122、T> *> list;</p><p>  BinaryTreeNode<T> *p=root;</p><p>  while(!list.empty() || p!=NULL)</p><p><b>  {</b></p><p>  while(p!=NULL)</p>&l

123、t;p><b>  {</b></p><p>  list.push(p);</p><p>  p=p->GetLeftChild();</p><p><b>  }</b></p><p>  p=list.top();</p><p>  list.po

124、p();</p><p>  cout<<p->GetData();</p><p>  p=p->GetRightChild();</p><p><b>  }</b></p><p><b>  }</b></p><p>  template&

125、lt;class T></p><p>  void BinaryTree<T>::PostOrderTraverse(const BinaryTreeNode<T>* p) const //二叉樹的后序遍歷(遞歸)成員函數(shù)定義</p><p><b>  {</b></p><p>  if(root==NUL

126、L)</p><p><b>  {</b></p><p>  cout<<"二叉樹為空,請先創(chuàng)建二叉樹!";</p><p><b>  return;</b></p><p><b>  }</b></p><p>

127、  if(p==NULL)</p><p><b>  {</b></p><p><b>  return;</b></p><p><b>  }</b></p><p>  PostOrderTraverse(p->GetLeftChild());</p>

128、;<p>  PostOrderTraverse(p->GetRightChild());</p><p>  cout<<p->GetData();</p><p><b>  }</b></p><p>  template<class T></p><p>  vo

129、id BinaryTree<T>::PostOrderTraverse() const //二叉樹的后序遍歷(非遞歸)成員函數(shù)定義</p><p><b>  {</b></p><p>  if(root==NULL)</p><p><b>  {</b></p><p>  co

130、ut<<"二叉樹為空,請先創(chuàng)建二叉樹!";</p><p><b>  return;</b></p><p><b>  }</b></p><p>  stack<BinaryTreeNode<T> *> list;</p><p>  B

131、inaryTreeNode<T> *p=root;</p><p>  BinaryTreeNode<T> *q;</p><p>  bool flag;</p><p>  while(!list.empty() || p!=NULL)</p><p><b>  {</b></p>

132、;<p>  while(p!=NULL)</p><p><b>  {</b></p><p>  list.push(p);</p><p>  p=p->GetLeftChild();</p><p><b>  }</b></p><p><

133、;b>  q=NULL;</b></p><p><b>  flag=1;</b></p><p>  while(flag && !list.empty())</p><p><b>  {</b></p><p>  p=list.top();</p&g

134、t;<p>  if(p->GetRightChild()==q)</p><p><b>  {</b></p><p>  cout<<p->GetData();</p><p>  list.pop();</p><p><b>  q=p;</b><

135、;/p><p>  if(list.empty())</p><p><b>  {</b></p><p><b>  p=NULL;</b></p><p><b>  }</b></p><p><b>  }</b></p

136、><p><b>  else</b></p><p><b>  {</b></p><p>  p=p->GetRightChild();</p><p><b>  flag=0;</b></p><p><b>  }</b&g

137、t;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  template<class T></p><p>  BinaryTree<T>:

138、:~BinaryTree() //二叉樹析構(gòu)函數(shù)定義</p><p><b>  {</b></p><p>  Destroy(root);</p><p><b>  }</b></p><p>  template<class T></p><p>  

139、void BinaryTree<T>::Destroy(BinaryTreeNode<T>* p) //二叉樹級聯(lián)釋放結(jié)點內(nèi)存函數(shù)定義</p><p><b>  {</b></p><p>  if(p!=NULL)</p><p><b>  {</b></p><p&g

140、t;  Destroy(p->GetLeftChild());</p><p>  Destroy(p->GetRightChild());</p><p><b>  delete p;</b></p><p><b>  p=NULL;</b></p><p><b>  

141、}</b></p><p><b>  }</b></p><p>  template<class T></p><p>  void BinaryTree<T>::NodeCounter(const BinaryTreeNode<T>* p,int& sum) const //統(tǒng)計二叉

142、樹結(jié)點個數(shù)函數(shù)定義</p><p><b>  {</b></p><p>  if(p==NULL)</p><p><b>  {</b></p><p><b>  return;</b></p><p><b>  }</b>

143、;</p><p><b>  sum++;</b></p><p>  NodeCounter(p->GetLeftChild(),sum);</p><p>  NodeCounter(p->GetRightChild(),sum);</p><p><b>  }</b></

144、p><p>  template<class T></p><p>  int BinaryTree<T>::Depth(const BinaryTreeNode<T>* p) const //計算二叉樹深度函數(shù)聲明</p><p><b>  {</b></p><p>  if(p=

145、=NULL)</p><p><b>  {</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int h1=Depth(p->GetLeftChild());</p><p&g

146、t;  int h2=Depth(p->GetRightChild());</p><p>  return h1>h2 ? h1+1 : h2+1;</p><p><b>  }</b></p><p><b>  遍歷二叉樹.cpp</b></p><p>  #include&l

147、t;iostream></p><p>  #include<iomanip></p><p>  #include<string></p><p>  #include<ctime></p><p>  #include<conio.h></p><p>  #i

148、nclude"BinaryTree.h" //二叉樹模板類頭文件</p><p>  using namespace std;</p><p>  char limittime(int i); //限時輸入函數(shù)聲明</p><p>  void menu(int second=30); //菜單輸出函數(shù)聲明&l

溫馨提示

  • 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

提交評論