二叉樹基本操作演示程序的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
二叉樹基本操作演示程序的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
二叉樹基本操作演示程序的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
二叉樹基本操作演示程序的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
二叉樹基本操作演示程序的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、二叉樹基本操作演示程序的設(shè)計(jì)與實(shí)現(xiàn)2012級電器信息類X班 (姓名) (學(xué)號)注意:文檔以word格式提供,文件名起名規(guī)則:學(xué)號+姓名+實(shí)驗(yàn)報(bào)告名稱一、需求分析1、創(chuàng)建二叉樹。按照用戶需要的二叉樹,構(gòu)建二叉樹。2、將創(chuàng)建的二叉樹,以樹狀形式輸出。3、分別以先序、中序、后序三種方式遍歷訪問二叉樹。4、輸出二叉樹的葉子結(jié)點(diǎn)及葉子結(jié)點(diǎn)的個(gè)數(shù)。5、輸出二叉樹的高度。6、將創(chuàng)建的二叉樹,以括號形式輸出。二、概要設(shè)計(jì)為了實(shí)現(xiàn)以上功能,可以從三個(gè)方面著手設(shè)計(jì)。1、主界面設(shè)計(jì)為了實(shí)現(xiàn)二叉樹相關(guān)操作功能的管理,設(shè)計(jì)一個(gè)含有多個(gè)菜單項(xiàng)的主控菜單子程序以鏈接系統(tǒng)的各項(xiàng)子功能,方便用戶使用本程序。本系統(tǒng)主控菜單運(yùn)行界

2、面如圖1所示。首先請輸入二叉樹結(jié)點(diǎn)序列:請按菜單提示操作: -歡迎使用二叉樹基本操作程序- 菜單選擇 1. 樹狀輸出二叉樹 2. 先序遍歷二叉樹 3. 中序遍歷二叉樹 4. 后序遍歷二叉樹 5. 輸出葉子結(jié)點(diǎn) 6. 輸出葉子結(jié)點(diǎn)個(gè)數(shù) 7. 輸出二叉樹的深度 8. 括號形式輸出二叉樹9. 退出 -圖1 二叉樹基本操作程序主菜單2、存儲結(jié)構(gòu)設(shè)計(jì)本程序采用二叉鏈?zhǔn)酱鎯︻愋?BiTNode)存儲二叉樹的結(jié)點(diǎn)信息。二叉樹的鏈表中的結(jié)點(diǎn)至少包含3個(gè)域:數(shù)據(jù)域(data)、左孩子指針域(lchild)、右孩子指針域(rchild)。3、系統(tǒng)功能設(shè)計(jì)本程序除了完成二叉樹的創(chuàng)建功能外還設(shè)置了9個(gè)子功能菜單。由于

3、這9個(gè)子功能都是建立在二叉樹的構(gòu)造上的,所以二叉樹的創(chuàng)建由主函數(shù)main()實(shí)現(xiàn)。9個(gè)子功能的設(shè)計(jì)描述如下:樹狀輸出二叉樹。樹狀輸出二叉樹由函數(shù)TranslevelPrint()實(shí)現(xiàn)。當(dāng)用戶選擇此功能時(shí),系統(tǒng)即以樹狀的形式輸出用戶所創(chuàng)建的二叉樹。先序遍歷二叉樹。由函數(shù)Preorder()實(shí)現(xiàn)。該功能按照先序遍歷訪問二叉樹的方法輸出先序序列。中序遍歷二叉樹。由函數(shù)Inorder()實(shí)現(xiàn)。該功能按照中序遍歷訪問二叉樹的方法輸出中序序列。后序遍歷二叉樹。由函數(shù)Postorder()實(shí)現(xiàn)。該功能按照后序遍歷訪問二叉樹的方法輸出后序序列。輸出葉子結(jié)點(diǎn)。該功能采用先序遍歷二叉樹的方法依次輸出葉子結(jié)點(diǎn)。由函

4、數(shù)Preorderleaf()實(shí)現(xiàn)。輸出葉子結(jié)點(diǎn)個(gè)數(shù)。該功能計(jì)算并輸出二叉樹中葉子結(jié)點(diǎn)的個(gè)數(shù),由LeafCount()實(shí)現(xiàn)。采用遞歸算法計(jì)算二叉樹中葉子結(jié)點(diǎn)的個(gè)數(shù),算法思想是:當(dāng)二叉樹為空樹時(shí),葉子結(jié)點(diǎn)總數(shù)為0;當(dāng)二叉樹只有1個(gè)結(jié)點(diǎn)時(shí),葉子結(jié)點(diǎn)總數(shù)為1;否則,葉子結(jié)點(diǎn)個(gè)數(shù)等于左右子樹葉子結(jié)點(diǎn)數(shù)之和。輸出二叉樹的深度。該功能輸出二叉樹的深度,由函數(shù)PostorderDepth()實(shí)現(xiàn),采用后序遍歷的遞歸算法求二叉樹的深度。括號形式輸出二叉樹。以括號形式輸出二叉樹由函數(shù),由函數(shù)output()實(shí)現(xiàn)。當(dāng)用戶選擇此功能時(shí),系統(tǒng)即以括號形式輸出二叉樹。退出。由exit(0)函數(shù)實(shí)現(xiàn)。三、模塊設(shè)計(jì)1、模塊

5、設(shè)計(jì)本程序包含三個(gè)模塊,主程序模塊、建立二叉樹模塊和工作區(qū)選擇模塊。其調(diào)用關(guān)系如圖2所示。主程序模塊建立二叉樹模塊工作區(qū)選擇模塊圖2 模塊調(diào)用示意圖2、系統(tǒng)子程序用功能設(shè)計(jì)本系統(tǒng)共設(shè)置12個(gè)子程序,各子程序的函數(shù)名及功能說明如下:void CreateBiTree(BiTree &T) /先序建立二叉樹void TranslevelPrint(BiTree T) /樹形打印二叉樹void Visit(char ch) /輸出結(jié)點(diǎn)void Preorder(BiTree T) /先序遍歷二叉樹void Inorder(BiTree T) /中序遍歷二叉樹void Postorder(Bi

6、Tree T) /后序遍歷二叉樹void PreorderLeaf(BiTree T) /輸出葉子結(jié)點(diǎn)int LeafCount(BiTree T) /輸出葉子結(jié)點(diǎn)的個(gè)數(shù)int PostorderDepth(BiTree T) /輸出二叉樹的深度void output(BiTree T) /以括號形式輸出二叉樹void mainwork() /主工作函數(shù),操作區(qū)用戶界面void main() /主函數(shù)。創(chuàng)建二叉樹,調(diào)用工作區(qū)模塊函數(shù)3、函數(shù)主要調(diào)用關(guān)系圖本系統(tǒng)12個(gè)子程序之間的主要調(diào)用關(guān)系如圖3所示。圖中數(shù)字是各函數(shù)的編號。圖3系統(tǒng)函數(shù)調(diào)用關(guān)系圖四、詳細(xì)設(shè)計(jì)1、數(shù)據(jù)類型定義typedef st

7、ruct BiTNode /定義二叉樹結(jié)點(diǎn)結(jié)構(gòu) char data; struct BiTNode *lchild,*rchild;BiTNode,*BiTree;2、系統(tǒng)主要子程序詳細(xì)設(shè)計(jì)主函數(shù)模塊主函數(shù)。創(chuàng)建二叉樹,調(diào)用工作區(qū)模塊函數(shù)。void main() cout<<"首先請輸入二叉樹結(jié)點(diǎn)序列: n" CreateBiTree(T); cout<<"請按菜單提示操作:n" mainwork();建立二叉樹模塊void CreateBiTree(BiTree &T)/先序建立二叉樹 char ch; cin>&

8、gt;ch; if(ch='#') T=NULL; else T=new BiTNode; T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); 用戶工作區(qū)模塊主工作函數(shù),操作區(qū)用戶界面設(shè)計(jì)。void mainwork() int yourchoice; cout<<"n-歡迎使用二叉樹基本操作程序-n" cout<<"n 菜單選擇 nn" cout<<" 1. 樹狀輸出二叉樹 2. 先序遍歷二叉樹 n&q

9、uot; cout<<" 3. 中序遍歷二叉樹 4. 后序遍歷二叉樹 n" cout<<" 5. 輸出葉子結(jié)點(diǎn) 6. 輸出葉子結(jié)點(diǎn)個(gè)數(shù) n" cout<<" 7. 輸出二叉樹的深度 8. 括號形式輸出二叉樹 n" cout<<" 9. 退出 n" cout<<"n-n" cout<<"請輸入你的選擇: " cin>>yourchoice; while(!(yourchoice=1|yourch

10、oice=2|yourchoice=4|yourchoice=5| yourchoice=6|yourchoice=7|yourchoice=8|yourchoice=9) cout<<"輸入不正確,請重新輸入n" cin>>yourchoice; while(1) switch(yourchoice) case 1:cout<<"樹的形狀為:" TranslevelPrint(T);break; case 2:cout<<"先序遍歷為:" Preorder(T);break; case

11、 3:cout<<"中序遍歷為:" Inorder(T);break; case 4:cout<<"后序遍歷為:" Postorder(T);break; case 5:cout<<"葉子結(jié)點(diǎn)為:" PreorderLeaf(T);break; case 6:cout<<"葉子結(jié)點(diǎn)個(gè)數(shù)為:"<<LeafCount(T);break; case 7:cout<<"二叉樹的深度為:"<<PostorderDepth(

12、T);break; case 8:cout<<"括號形式輸出二叉樹為:"output(T);break; case 9:system("cls"); exit(0); break; default: break; cout<<"n按任意鍵繼續(xù):" getch(); system("cls"); cout<<"n-歡迎使用二叉樹基本操作程序-n" cout<<"n 菜單選擇 nn" cout<<" 1. 樹狀

13、輸出二叉樹 2. 先序遍歷二叉樹 n" cout<<" 3. 中序遍歷二叉樹 4. 后序遍歷二叉樹 n" cout<<" 5. 輸出葉子結(jié)點(diǎn) 6. 輸出葉子結(jié)點(diǎn)個(gè)數(shù) n" cout<<" 7. 輸出二叉樹的深度 8. 括號形式輸出二叉樹 n" cout<<" 9. 退出 n" cout<<"n-n" cout<<"請輸入你的選擇: " cin>>yourchoice; /endwhi

14、le(1)/endmainwork五、測試結(jié)果根據(jù)先根結(jié)點(diǎn),按照從上到下,從左到右的次序依次先根遍歷的方法,分別輸入二叉樹的結(jié)點(diǎn)序列(#號表示該結(jié)點(diǎn)為空)。例如,輸入“ABD#E#CH#”,程序運(yùn)行得到如圖1所示的開始界面。各子功能測試運(yùn)行結(jié)果如下。1、樹狀輸出二叉樹在主菜單下,用戶輸入1并回車,運(yùn)行結(jié)果如圖4所示。 圖4 按樹形輸出所創(chuàng)建的二叉樹2、先序遍歷二叉樹在主菜單下,用戶輸入2并回車,運(yùn)行結(jié)果如圖5所示。圖5 輸出二叉樹的先序遍歷序列3、中序遍歷二叉樹在主菜單下,用戶輸入3并回車,運(yùn)行結(jié)果如圖6所示。4、后序遍歷二叉樹在主菜單下,用戶輸入4并回車,運(yùn)行結(jié)果如圖7所示。 圖6 輸出二叉

15、樹的中序遍歷序列 圖7 輸出二叉樹的后序遍歷序列5、輸出葉子結(jié)點(diǎn)在主菜單下,用戶輸入5并回車,運(yùn)行結(jié)果如圖8所示。6、輸出葉子結(jié)點(diǎn)個(gè)數(shù)在主菜單下,用戶輸入6并回車,運(yùn)行結(jié)果如圖9所示。 圖8 輸出二叉樹的葉子結(jié)點(diǎn) 圖9輸出二叉樹的葉子結(jié)點(diǎn)個(gè)數(shù)7、輸出二叉樹的深度在主菜單下,用戶輸入7并回車,運(yùn)行結(jié)果如圖10所示。8、括號形式輸出二叉樹在主菜單下,用戶輸入8并回車,運(yùn)行結(jié)果如圖11所示。 圖10 輸出二叉樹的深度 圖11 以括號形式輸出二叉樹9、退出在主菜單下,用戶輸入9并回車,即退出“二叉樹基本操作程序”。六、用戶使用說明1、本程序執(zhí)行文件為“二叉樹的基本操作演示.exe”。2、進(jìn)入本程序后,

16、首先按照提示輸入二叉樹的結(jié)點(diǎn),如按下列次序順序讀入字符ABD#E#CH#。 3、隨即顯示系統(tǒng)主菜單界面,用戶可在該界面下輸入各功能前對應(yīng)的數(shù)字并按回車,執(zhí)行相應(yīng)命令。七、實(shí)驗(yàn)體會(略)八、源程序清單/二叉樹基本操作演示程序的設(shè)計(jì)與實(shí)現(xiàn)/二叉樹的基本操作演示.CPP#include <iostream.h>#include "stdlib.h"#include "conio.h"#include "math.h"#define MaxSize 100#define NLAYER 4typedef struct BiTNode

17、 char data; struct BiTNode *lchild,*rchild;BiTNode,*BiTree;BiTree T;/1.建立二叉樹void CreateBiTree(BiTree &T)/先序建立二叉樹 char ch; cin>>ch; if(ch='#') T=NULL; else T=new BiTNode; T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); /2.樹形打印二叉樹void TranslevelPrint(BiTree T)

18、/本算法實(shí)現(xiàn)二叉樹按層打印 struct node BiTree vecMaxSize; /存放樹結(jié)點(diǎn) int layerMaxSize; /結(jié)點(diǎn)所在的層 int locateMaxSize; /打印結(jié)點(diǎn)的位置int front,rear; q; /定義隊(duì)列q int i,j=1,k=0,nLocate; q.front=q.rear=0; /初始化隊(duì)列q隊(duì)頭、隊(duì)尾 cout<<"n " q.vecq.rear=T; /二叉樹的根結(jié)點(diǎn)入隊(duì) q.layerq.rear=1; q.locateq.rear=20; q.rear=q.rear+1; while(q.f

19、ront<q.rear) T=q.vecq.front; i=q.layerq.front; nLocate=q.locateq.front; if(j<i) /進(jìn)層打印時(shí)換行 cout<<"nn" j=j+1; k=0; while(k+<nLocate) cout<<" "while(k+<nLocate-1) cout<<" " /結(jié)點(diǎn)深度控制橫向位置cout<<T->data;q.front=q.front+1;if(T->lchild!=NU

20、LL) /存在左子樹,將左子樹的根結(jié)點(diǎn)入隊(duì)列 q.vecq.rear=T->lchild; q.layerq.rear=i+1; q.locateq.rear=int(nLocate-pow(2,NLAYER-i-1); q.rear=q.rear+1;if(T->rchild!=NULL) /存在右子樹,將右子樹的根結(jié)點(diǎn)入隊(duì)列 q.vecq.rear=T->rchild; q.layerq.rear=i+1; q.locateq.rear=int(nLocate+pow(2,NLAYER-i-1); q.rear=q.rear+1; /3.輸出結(jié)點(diǎn)void Visit(ch

21、ar ch) cout<<ch;/4.先序遍歷二叉樹void Preorder(BiTree T)/先序遍歷二叉樹,T為指向二叉樹(或某一子樹)根結(jié)點(diǎn)的指針 if(T!=NULL) Visit(T->data); /訪問根結(jié)點(diǎn) Preorder(T->lchild); /先序遍歷左子樹 Preorder(T->rchild); /先序遍歷右子樹 /5.中序遍歷二叉樹void Inorder(BiTree T)/中序遍歷二叉樹,T為指向二叉樹(或某一子樹)根結(jié)點(diǎn)的指針 if(T!=NULL) Inorder(T->lchild); /中序遍歷左子樹 Visit

22、(T->data); /訪問根結(jié)點(diǎn) Inorder(T->rchild); /中序遍歷右子樹 /6.后序遍歷二叉樹void Postorder(BiTree T)/后序遍歷二叉樹,T為指向二叉樹(或某一子樹)根結(jié)點(diǎn)的指針 if(T!=NULL) Postorder(T->lchild); /后序遍歷左子樹 Postorder(T->rchild); /后序遍歷右子樹 Visit(T->data); /訪問根結(jié)點(diǎn) /7.輸出葉子結(jié)點(diǎn)void PreorderLeaf(BiTree T)/先序遍歷二叉樹并輸出葉子結(jié)點(diǎn),T為指向二叉樹根結(jié)點(diǎn)的指針 if(T!=NULL)

23、 if(T->lchild=NULL&&T->rchild=NULL) Visit(T->data); /訪問根結(jié)點(diǎn) PreorderLeaf(T->lchild); /先序遍歷左子樹 PreorderLeaf(T->rchild); /先序遍歷右子樹 /8.輸出葉子結(jié)點(diǎn)的個(gè)數(shù)int LeafCount(BiTree T) int LeafNum; if(T=NULL) LeafNum=0; else if(T->lchild=NULL)&&(T->rchild=NULL) LeafNum=1; else LeafNum

24、=LeafCount(T->lchild)+LeafCount(T->rchild); return LeafNum;/9.輸出二叉樹的深度int PostorderDepth(BiTree T) /后序遍歷求二叉樹深度的遞歸算法 int hl,hr,max; if(T!=NULL) hl=PostorderDepth(T->lchild); /求左子樹的深度 hr=PostorderDepth(T->rchild); /求右子樹的深度 max=hl>hr?hl:hr; /得到左右子樹深度較大者 return (max+1); /返回樹的深度 else retur

25、n 0; /空樹返回0/10. 以括號形式輸出二叉樹void output(BiTree T) if(T!=NULL) cout<<T->data; if(T->lchild!=NULL|T->rchild!=NULL) cout<<"(" output(T->lchild); if(T->rchild!=NULL) cout<<"," output(T->rchild); cout<<")" /11.主工作函數(shù),操作區(qū)用戶界面void mainwor

26、k() int yourchoice; cout<<"n-歡迎使用二叉樹基本操作程序-n" cout<<"n 菜單選擇 nn" cout<<" 1. 樹狀輸出二叉樹 2. 先序遍歷二叉樹 n" cout<<" 3. 中序遍歷二叉樹 4. 后序遍歷二叉樹 n" cout<<" 5. 輸出葉子結(jié)點(diǎn) 6. 輸出葉子結(jié)點(diǎn)個(gè)數(shù) n" cout<<" 7. 輸出二叉樹的深度 8. 括號形式輸出二叉樹 n" cout&

27、lt;<" 9. 退出 n" cout<<"n-n" cout<<"請輸入你的選擇: " cin>>yourchoice; while(!(yourchoice=1|yourchoice=2|yourchoice=4|yourchoice=5| yourchoice=6|yourchoice=7|yourchoice=8|yourchoice=9) cout<<"輸入不正確,請重新輸入n" cin>>yourchoice; while(1) switch(yourchoice) case 1:cout<<"樹的形狀為:" TranslevelPrint(T);break; case 2:cout<<"先序遍歷為:" Preorder(T);break; case 3:cout<<"中序遍歷為:" Inorder(T);break; case 4:cout<<"后序遍歷為:" Postorder(T);break; ca

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論