版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計
- 二叉樹課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--按層次遍歷二叉樹
- 二叉樹的遍歷與其結(jié)點的計算課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計之二叉樹的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉樹的遍歷算法集成
- 課程設(shè)計 排序二叉樹
- 平衡二叉樹匹配課程設(shè)計
- 平衡二叉樹匹配課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---線索二叉樹的生成及其遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹的遍歷算法分析與設(shè)計
- 課程設(shè)計---判斷完全二叉樹
- 二叉樹基本操作課程設(shè)計
- 課程設(shè)計---二叉樹的查找
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉樹和中序遍歷的演示
- 二叉樹的基本操作課程設(shè)計
- 課程設(shè)計---完全二叉樹的判斷
- 二叉樹數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉樹的建立和遍歷的演示
評論
0/150
提交評論