




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Visual C+ 6.0調(diào)試功能 圖解教程(3)-實例二樹和二叉樹 1. 實驗?zāi)康?1.熟悉二叉樹的二叉鏈表存儲結(jié)構(gòu); 2.掌握構(gòu)造二叉樹的方法; 3.加深對二叉樹的遍歷的理解。 二.需求分析 本程序演示用C+編寫,完成按先序遍歷生成二叉樹,先序遍歷打印輸出二叉樹, 后序遍歷打印輸出二叉樹, 中序遍歷打印輸出二叉樹, 層序遍歷打印輸出二叉樹, 先序遍歷方法交換左右子樹,求樹的高度,求樹的葉子結(jié)點個數(shù). 輸入值的范圍:建立一棵二叉時,要求結(jié)點的的左右孩子為空時輸入0代替.所有輸入值必須為整形.輸入的結(jié)點個數(shù):若為單邊二叉樹(全只有左結(jié)點或全只有右
2、結(jié)點)則為任意個數(shù);若非單邊二叉則要求結(jié)點最多的層個數(shù)不得超過MAXSIZE的值. 輸出形式:輸出時如果結(jié)點的左右指針這空則以" #"代替輸出. 程序所能完成的功能:程序能完成按先序遍歷生成二叉樹,先序遍歷打印輸出二叉樹, 后序遍歷打印輸出二叉樹, 中序遍歷打印輸出二叉樹, 層序遍歷打印輸出二叉樹, 先序遍歷方法交換左右子樹,求樹的高度,求樹的葉子結(jié)點個數(shù).操作. 測試數(shù)據(jù) A建立二叉樹中輸入1230000 生成一棵樹123# B交換左右子樹得到一棵二叉樹1#2#3# C按層序遍歷樹得到一棵二叉樹1#2#3# D求二叉樹的高度得到高度3 E求葉子結(jié)點個數(shù)得到個數(shù)1 三.設(shè)計
3、概要 (1)為了實現(xiàn)上述程序的功能,需要定義二叉樹的抽象數(shù)據(jù)類型: ADT BiTree is 數(shù)據(jù)對象:D=ai|aiIntegerSet,i=0,1,2,n,n0 數(shù)據(jù)關(guān)系:R=<ai,ai+1>|ai,ai+1 D 基本操作: creat() 操作結(jié)果:建立一棵二叉樹 preorder() 初始條件:二叉樹已經(jīng)存在 操作結(jié)果:先序遍歷顯示二叉樹 preordertswap() 初始條件: 二叉樹已經(jīng)存在 操作結(jié)果:交換二叉樹的左右子樹 theight() 初始條件: 二叉樹已經(jīng)存在 操作結(jié)果:輸出二叉樹的高度 tleaves() 初始條件: 操作結(jié)果:輸出二叉樹的葉子結(jié)點個數(shù)
4、 levelorder() 初始條件: 二叉樹已經(jīng)存在 操作結(jié)果:層序遍歷顯示二叉樹 ADT BiTree (2) 本程序包含兩個類和一個結(jié)構(gòu)體類型 A基類:隊列類SeQueue有5個函數(shù) 1.構(gòu)造函數(shù) SeQueue
5、() 2.析構(gòu)函數(shù) SeQueue() 3.進隊函數(shù)
6、; AddQ(NodeType x) 4.出隊函數(shù)
7、 DelQ() 5.判斷非空函數(shù) IsEmpty() B派生類:二叉樹類BiTree有20個函數(shù) 1主函數(shù)
8、60; main() 2. 構(gòu)造函數(shù) &
9、#160; BiTree() 3. 析構(gòu)函數(shù) BiTree()
10、 4. 建立樹函數(shù) creat0() 5. 先序遍歷函數(shù)
11、0; void preorder() 6. 中序遍歷函數(shù) inorder() 7. 后序
12、遍歷函數(shù) postorder() 8.層序遍歷函數(shù)
13、 levelorder() 9. 交換左右子樹函數(shù) preordertswap() 10. 求二叉樹高度函數(shù)
14、160; theight() 11. 求二叉樹葉子結(jié)點個數(shù)函數(shù) tleaves() 12. 建立二叉樹遞歸算法函數(shù)
15、; *creat() 13. 先序遍歷遞歸算法函數(shù) preorder(NodeType *p) 14. 中序遍歷遞歸算法函數(shù)
16、 inorder(NodeType *p) 15. 后序遍歷遞歸算法函數(shù) postorder(NodeType *p) 16. 按層遍歷
17、算法函數(shù) levelorder(NodeType *p) 17. 先序遍歷方法交換左右子樹函數(shù) preorderswap(NodeType *p)
18、 18. 求二叉樹高度遞歸算法函數(shù) height(NodeType *p) 19. 求二叉樹葉子結(jié)點個數(shù)的遞歸算法函數(shù) leaves(NodeType *p) 20. 刪除二叉樹所有結(jié)點函數(shù)
19、0; destroy(NodeType* &p) C結(jié)構(gòu)體類型NodeType (3)本程序的三個文件 1.頭文件BiTree.h 2.源文件 Queue.cpp BiTree.cpp (4)函數(shù)之間的關(guān)系 四.詳細設(shè)計 1/BiTree.h
20、160;2/#include <iostream.h> 3#include <iostream> / Visual Studio 2008中要求的 4#include "stdlib.h" 5#define MAXSIZE 2 6typedef int ElemType;&
21、#160; 7using namespace std; / Visual Studio 2008中要求的 8 9struct NodeType
22、; /定義結(jié)點結(jié)構(gòu)體 10 11 ElemType data; 12 NodeType
23、 *lch,*rch; 13; 14 15/隊列 16class SeQueue /定義隊列類SeQueue 17
24、;18private: 19 NodeType elemMAXSIZE; /存儲隊列的數(shù)組個數(shù) 20 int front,rear; &
25、#160; /隊頭,隊尾 21public: 22 SeQueue(); 23 SeQueue(); 24 void AddQ(NodeType x);
26、 /入隊函數(shù) 25 NodeType DelQ(); /出隊函數(shù) 26 int IsEmpty() &
27、#160; /判斷隊列非空函數(shù) 27 28 return front = rear; 29 30; 31 32/二叉樹
28、 33class BiTree:public SeQueue /定義二叉樹類BiTree 作為隊列類SeQueue的派生類 34 35 public: 36 BiTree() root = NULL;
29、60; /構(gòu)造函數(shù) 37 BiTree() destroy(root); /析構(gòu)函數(shù) 38
30、60; void preorder() /先序遍歷 39 preorder(root);
31、60; 40 void inorder() /中序遍歷 41 inord
32、er(root); 42 void postorder()
33、0;/后序遍歷 43 postorder(root); 44 45 void preordertswap()
34、 /交換左右子樹 46 preorderswap(root); 47 int theight()
35、 /求二叉樹高度 48 return height(root); 49 int tleaves()
36、 /求二叉樹葉子結(jié)點個數(shù) 50 return leaves( root ); 51 void levelorder()
37、0; /按層遍歷 52 levelorder(root); 53
38、160; void creat0(); /建立樹函數(shù) 54 private: 55 NodeType *root;
39、; /數(shù)據(jù)成員,根結(jié)點 56 NodeType *creat(); /建立二叉樹遞
40、歸算法 57 void preorder(NodeType *p); /先序遍歷遞歸算法 58 void inorder(NodeType *p); &
41、#160; /中序遍歷遞歸算法 59 void postorder(NodeType *p); /后序遍歷遞歸算法 60 void levelorder(NodeType *p
42、); /按層遍歷算法 61 void preorderswap(NodeType *p); /利用先序遍歷方法交換左右子樹 62 int
43、height(NodeType *p); /求二叉樹高度遞歸算法 63 int leaves(NodeType *p); /求二叉樹葉子結(jié)點個數(shù)的遞歸算法 64
44、 void destroy(NodeType* &p); /刪除二叉樹所有結(jié)點 65; 66 67/BiTree.cpp 68#include "BiTree.h" 69 70void BiTree:creat0()
45、0; /建立樹函數(shù), 71 72 cout << "請按照樹的先序遍歷順序組織數(shù)據(jù)" << endl; 73
46、; cout << "若結(jié)點信息是int,把每個結(jié)點的空孩子以輸入;" << endl; 74 cout << "一個結(jié)點的二叉樹,輸入:0 0;" << endl; 75 root = creat();
47、160; /調(diào)用私有creat()(工具函數(shù)); 76 77NodeType * BiTree:creat() /遞歸建立二叉樹算法 78 79 NodeType *p; 80 ElemTyp
48、e x; 81 cout << "n 輸入數(shù)據(jù):" 82 cin >> x; 83 if( x = 0 ) /若左或右孩子為空,置當(dāng)前指針這空. 84
49、; p = NULL; 85 else 86 p = new NodeType; 87 p-&g
50、t;data = x; 88 p->lch = creat(); /遞歸調(diào)用自身 89
51、0; p->rch = creat(); 90 91 return p; 92 93 94/先序遍歷遞歸算法 95void BiTree:preorder(NodeType *p)
52、0; /先序遍歷顯示 96 97 if( p != NULL) 98 99 cout << p->data;100 preorder( p-&
53、gt;lch ); /遞歸調(diào)用自身101 preorder( p->rch ); /遞歸調(diào)用自身102 103 else104
54、160; cout <<"#"105106/中序遍歷遞歸算法107void BiTree:inorder(NodeType *p) /中序遍歷顯示108 109 110 if( p != NULL )111 112
55、0; inorder( p->lch ); /遞歸調(diào)用自身113 cout << p->data;114 inorder( p->rch );
56、160; /遞歸調(diào)用自身115 116 else117 cout << "#" 118119120/后序遍歷遞歸算法121void BiTree:postorder(NodeType *p)122123 if( p !=
57、 NULL )124 125 126 postorder( p-> lch ); /遞歸調(diào)用自身127 postorder
58、( p-> rch ); /遞歸調(diào)用自身128 cout << p->data;129 130 else131 cout <<&q
59、uot;#"132133void BiTree:preorderswap(NodeType *p) /利用先序遍歷方法交換左右子樹134 135 if( p != NULL )136
60、60;137 NodeType *r; 138 r = p->lch;139 p->lch = p->rch; 140 p->rc
61、h = r;141/上面幾條語句可以認為對結(jié)點的訪問(交換左右孩子)142/替換了原來的:cout<<p->data<<" " 語句143 preorderswap( p->lch ); /遞歸調(diào)用自身144
62、160; preorderswap( p->rch );145 146147void BiTree:destroy(NodeType* &p) /刪除二叉樹所有結(jié)點148149 if(p != NULL)150
63、 destroy( p->lch );151 destroy( p->rch );152 delete p;153 p = NULL;154 155156i
64、nt BiTree:height(NodeType *p) /求二叉樹高度遞歸算法157 158 int hl,hr;159 if( p != NULL )160
65、160; 161 hl = height( p->lch );162 hr = height( p->rch );163 return ( hl >
66、0;hr ? hl : hr ) + 1; /當(dāng)前結(jié)點高度是以最大的(左右)子樹的高度加得到164 165 166 else167 return
67、0;168169170/求二叉樹葉子結(jié)點個數(shù)的遞歸算法171int BiTree:leaves(NodeType *p)172173 if( p = NULL ) /當(dāng)前結(jié)點是否為空,當(dāng)為空時就沒有左右孩子174 return 0;175
68、; if( ( p-> lch = NULL ) && ( p-> rch = NULL ) /當(dāng)前結(jié)點是否有左右孩子176 177 return 1;178 179
69、 return leaves( p-> lch ) + leaves( p-> rch ); /遞歸調(diào)用自身累加葉子結(jié)點個數(shù)180181182/按層遍歷算法183void BiTree:levelorder(NodeType *p)184185 SeQueue q;
70、160; /初始化一個隊列186 NodeType *t = p;187 if (p)188 189 q.AddQ(*p); /根結(jié)點非空則入隊190 &
71、#160; 191 while (!q.IsEmpty()192 193 t = &(q.DelQ(); /隊非空則將結(jié)點指針出隊194 cout << t->data;
72、60; /并打印輸出結(jié)點的數(shù)據(jù)值195 if (t->lch)196 197 q.AddQ(*(t->lch); /存在左孩子則將其進隊198 &
73、#160; 199 else200 cout << "#"201202 if (t->rch)203
74、0; 204 q.AddQ(*(t->rch); /存在右孩子則將其進隊205 206 else207
75、; cout << "#"208 209210211/-212int main()213 214 int k; 215 BiTree root0;
76、 /聲明創(chuàng)建二叉樹對象,調(diào)用構(gòu)造函數(shù)216 do cout<<"nn"217 cout<<"nn 1. 建立二叉樹"218 cout<<"nn &
77、#160; 2. 交換左右子樹"219 cout<<"nn 3. 按層序遍歷樹" 220 cout<<"nn 4. 求二叉樹深度 "221
78、 cout<<"nn 5. 求葉子結(jié)點個數(shù)" 222 cout<<"nn 6. 結(jié)束程序運行"223 cout<<"n="224
79、0;cout<<"n 請輸入您的選擇(0,1,2,3,4,5,6):" 225 cin>>k;226 switch(k)227 228
80、 case 1: 229 cout << "nt 輸入(0)結(jié)束:"230
81、160; root0.creat0();231 cout << "nt 先序遍歷結(jié)果:"232
82、160; root0.preorder();233 cout << "nt 中序遍歷結(jié)果:" 234
83、 root0.inorder();235 cout << "nt 后序遍歷結(jié)果:" 236
84、; root0.postorder(); 237
85、160; break;238 case 2: 239 cout <<&q
86、uot;nt 交換左右子樹結(jié)果:"240 root0.preordertswap();241 cout&
87、#160;<< "nt 先序遍歷結(jié)果:"242 root0.preorder(); 243
88、60; cout << "nt 中序遍歷結(jié)果:"244 root0.inorder();245
89、160; cout << "nt 后序遍歷結(jié)果:" 246 root0.postorder();
90、160; 247 break;248 case 3: 249
91、; cout << "nt 按層序遍歷結(jié)果:"250 root0.levelorder(); 251
92、 break; 252 case 4: 253
93、 int deep;254 deep = root0.theight();255 &
94、#160; cout << "nt 樹的深度是:" << deep;256 break;257 case
95、5:258 int leaf;259 leaf = root0.tleaves();260
96、160; cout << "nt 樹的葉子結(jié)點個數(shù)是:" << leaf;261
97、0; break;262 case 6: exit(0);263 / switch264cout<<"n -"265 while(k>=0
98、0;&& k<6); 266 return 0;267/- 268269/Queue.cpp270#include "BiTree.h"271SeQueue:SeQueue() /初始化隊列272 273 front=0;274 rear=0;27527
99、6277SeQueue:SeQueue();278/進隊279void SeQueue:AddQ(NodeType x) 280 281 if(rear+1) % MAXSIZE=front)282 cout<<"QUEUE IS FULLn"283 else284
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 融合創(chuàng)新:跨學(xué)科視野
- 設(shè)計工作總結(jié)計劃
- 腐蝕對鋼底板波形腹板-混凝土組合橋梁可靠性能的影響研究
- “其他條件等同定律”的內(nèi)涵、爭議及發(fā)展趨勢研究
- 糖尿病前期人群動脈僵硬度及其影響因素調(diào)查研究
- 文旅融合背景下“雅安八景”文創(chuàng)設(shè)計探究
- 二零二五年度農(nóng)村土地墳地租賃與墓園租賃管理合同
- 二零二五年度智慧能源管理合伙人股權(quán)投資協(xié)議
- 二零二五年度股權(quán)解除與公司結(jié)構(gòu)調(diào)整合同
- 二零二五年度裝修材料綠色生產(chǎn)與采購服務(wù)合同
- 2024初級會計職稱考試題庫(附參考答案)
- 2024年呼和浩特職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫參考答案
- 小學(xué)二年級有余數(shù)的除法口算題(共300題)
- 幼兒園故事繪本《賣火柴的小女孩兒》課件
- 2024年英語專業(yè)四級考試真題及詳細答案
- 委托付款三方協(xié)議中英文版
- 三年級學(xué)生學(xué)情分析
- 產(chǎn)品安全符合性聲明
- 高中化學(xué)競賽-中級無機化學(xué)--金屬原子簇word版本
- 沖壓工藝與模具設(shè)計拉深
- 水泥穩(wěn)定碎石配合比設(shè)計報告7頁
評論
0/150
提交評論