數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告二叉排序樹的實(shí)現(xiàn)教案_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告二叉排序樹的實(shí)現(xiàn)教案_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告二叉排序樹的實(shí)現(xiàn)教案_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告二叉排序樹的實(shí)現(xiàn)教案_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告二叉排序樹的實(shí)現(xiàn)教案_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 WORD格式.分享 精品.資料 課 程 設(shè) 計(jì) 課程名稱 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 題目名稱 二叉排序樹的實(shí)現(xiàn) 學(xué) 院 應(yīng)用數(shù)學(xué)學(xué)院 專業(yè)班級(jí) 學(xué) 號(hào) 學(xué)生姓名 指導(dǎo)教師 2013 年 12 月 26 日1.設(shè)計(jì)任務(wù)實(shí)現(xiàn)二叉排序樹,包括生成、插入,刪除;對(duì)二叉排序樹進(jìn)行先根、中根、和后根非遞歸遍歷;每次對(duì)樹的修改操作和遍歷操作的顯示結(jié)果都需要在屏幕上 用樹的形狀表示出來。分別用二叉排序樹和數(shù)組去存儲(chǔ)一個(gè)班(50人以上)的成員信 息(至少包括學(xué)號(hào)、姓名、成績(jī)3項(xiàng)),對(duì)比查找效率,并說明 為什么二叉排序樹效率高(或者低)。2. 函數(shù)模塊:2.1.主函數(shù)main模塊功能1.通過bstree CreatTr

2、ee()操作建立二叉排序樹。 2.在二叉排序樹t中通過操作bstree InsertBST(bstree t,int key,nametype name,double grade)插入一個(gè)節(jié)點(diǎn)。3. 從二叉排序樹t中通過操作void Delete(bstree &p)刪除任意節(jié)點(diǎn)。4. 在二叉排序樹t中通過操作bstnode *SearchBST(bstree t,keytype key)查找節(jié)點(diǎn)。5. 在二叉排序樹t中通過操作p=SearchBST(t,key)查詢,并修改節(jié)點(diǎn)信息6. 非遞歸遍歷二叉排序樹。7. 定義函數(shù)void compare()對(duì)數(shù)組和二叉排序樹的查找效率進(jìn)行比較比較。

3、2.2創(chuàng)建二叉排序樹CreatTree模塊從鍵盤中輸入關(guān)鍵字及記錄,并同時(shí)調(diào)用插入函數(shù)并不斷進(jìn)行插入。最后,返回根節(jié)點(diǎn)T。2.3刪除模塊:二叉排序樹上刪除一個(gè)階段相當(dāng)于刪去有序系列中的一個(gè)記錄,只要在刪除某個(gè)節(jié)點(diǎn)之后依舊保持二叉排序樹的性質(zhì)即可。假設(shè)二叉排序樹上刪除節(jié)點(diǎn)為*p(指向節(jié)點(diǎn)的指針為p),其雙親節(jié)點(diǎn)為*f(節(jié)點(diǎn)指針為f)。若*p節(jié)點(diǎn)為葉子節(jié)點(diǎn),則即左右均為空樹,由于刪去葉子節(jié)點(diǎn)不破壞整棵樹的結(jié)構(gòu),則只需修改其雙親節(jié)點(diǎn)的指針即可;若*p節(jié)點(diǎn)只有左子樹或只有右子樹,此時(shí)只要令左子樹或右子樹直接成為其雙親節(jié)點(diǎn)*f的左子樹即可;若*p節(jié)點(diǎn)的左子樹和右子樹均不為空,其一可以令*p的左子樹為*f

4、的左子樹,而*p的右子樹為*s的右子樹,其二可以令*p的直接前驅(qū)(或直接后繼)替代*p,然后再從二叉排序樹中刪去它的直接前驅(qū)(或直接后繼)。在二叉排序樹中刪除一個(gè)節(jié)點(diǎn)的算法為void DeleteData(bstree &t,keytype key)若二叉排序樹t中存在關(guān)鍵字等于key的數(shù)據(jù)元素,則刪除該數(shù)據(jù)元素節(jié)點(diǎn),并返回TRUE,否則返回FALSE。2.4插入模塊二叉排序樹是一種動(dòng)態(tài)樹表,其特點(diǎn)是樹的結(jié)構(gòu)通常不是一次生成的,而是在查找的過程中,當(dāng)樹中不存在關(guān)鍵字等于給定值得節(jié)點(diǎn)時(shí)在進(jìn)行插入。新插入的節(jié)點(diǎn)一定是一個(gè)新添加的葉子節(jié)點(diǎn),并且是查找不成功時(shí)查找路徑上訪問的最后一個(gè)節(jié)點(diǎn)的左孩子或右孩

5、子的節(jié)點(diǎn)。一個(gè)無序系列可以通過構(gòu)造一棵二叉排序樹而變成一個(gè)有序系列,構(gòu)造樹的過程即為對(duì)無序系列進(jìn)行排序的過程, 并且每次插入的節(jié)點(diǎn)都是二叉排序樹上新的葉子節(jié)點(diǎn),則在進(jìn)行插入操作時(shí),不必移動(dòng)其他節(jié)點(diǎn),僅需改變某個(gè)節(jié)點(diǎn)的指針由空變?yōu)榉强占纯?。二叉排序樹的插入算法為bstree InsertBST(bstree t,int key,nametype name,double grade) 若二叉排序樹中不存在關(guān)鍵字等于key的數(shù)據(jù)元素時(shí),插入元素并返回TRUE。2.5查找模塊二叉排序樹又稱二叉查找樹,當(dāng)二叉排序樹不為空時(shí),首先將給定的值和根節(jié)點(diǎn)的關(guān)鍵字比較,若相等則查找成功,否則將依據(jù)給定的值和根節(jié)點(diǎn)

6、關(guān)鍵字之間的大小關(guān)系,分別在左子樹或右子樹上繼續(xù)進(jìn)行查找。為此定義一個(gè)二叉排序樹的查找算法為bstnode *SearchBST(bstree t,keytype key) 在根指針t所指向的二叉排序樹中查找關(guān)鍵字等于key的數(shù)據(jù)元素,如成功,返回指向該元素節(jié)點(diǎn)的指針,否則返回空指針。2.6效率比較compare模塊void compare()對(duì)數(shù)組和二叉排序樹的查找效率進(jìn)行比較比較。2.7二叉排序樹的遍歷先序遍歷也叫做 HYPERLINK /view/2872148.htm t _blank 先根遍歷。首先訪問根結(jié)點(diǎn)然后遍歷左子樹,最后遍歷右子樹。在遍歷左、右子樹時(shí),仍然先訪問根結(jié)點(diǎn),然后遍

7、歷左子樹,最后遍歷右子樹,如果二叉樹為空則返回。其實(shí)過程為:先遍歷左子樹root-left-left-left.-null,由于是先序遍歷,因此一遇到節(jié)點(diǎn),便需要立即訪問;由于一直走到最左邊后,需要逐步返回到父節(jié)點(diǎn)訪問右節(jié)點(diǎn),因此必須有一個(gè)措施能夠?qū)?jié)點(diǎn)序列回溯。其一可以用棧記憶在訪問途中將依次遇到的節(jié)點(diǎn)保存下來。根據(jù)棧的先進(jìn)后出、后進(jìn)先出的特點(diǎn)特點(diǎn)。則可以用棧保存。每次都將遇到的節(jié)點(diǎn)壓入棧,當(dāng)左子樹遍歷完畢后從棧中彈出最后一個(gè)訪問的節(jié)點(diǎn),然后訪問其右子樹。基本算法思想:1.先訪問根節(jié)點(diǎn),將根節(jié)點(diǎn)入棧2.重復(fù)執(zhí)行兩大步驟:如果該節(jié)點(diǎn)左孩子存在,則訪問該左孩子節(jié)點(diǎn),并將其指針入棧。重復(fù)以上操作,

8、直到節(jié)點(diǎn)的左孩子不存在。將棧頂?shù)脑?,即其指針出棧,回到父?jié)點(diǎn),如果該指針節(jié)點(diǎn)的右孩子存在,則將該指針指向的右孩子節(jié)點(diǎn)重復(fù)執(zhí)行以上步驟,直到桟為空為止。操作函數(shù)為void x_print(Tree T)中序遍歷:中序遍歷和先序遍歷訪問的順序不同。中序遍歷訪問順序?yàn)橹行虮闅v左子數(shù),在訪問根節(jié)點(diǎn),最后中序遍歷右子樹。先序遍歷是先訪問,再入棧;而中序遍歷則是先入棧,彈棧后再訪問。將二叉樹的根節(jié)點(diǎn)入棧,如果該節(jié)點(diǎn)有左孩子,將左孩子直接入棧,重復(fù)該操作,直到該節(jié)點(diǎn)無左孩子;在將棧頂元素出棧,并訪問該節(jié)點(diǎn)指向的節(jié)點(diǎn),如果該指針指向的右孩子存在,則將當(dāng)前指針指向右孩子節(jié)點(diǎn)。重復(fù)執(zhí)行步驟直到棧為空為止。操作函

9、數(shù)為void z_print(Tree T )。后序遍歷:先后序遍歷左子樹,在后序遍歷右子樹,最后訪問根節(jié)點(diǎn)。先將根節(jié)點(diǎn)入棧,如果該節(jié)點(diǎn)左孩子節(jié)點(diǎn)存在,將該節(jié)點(diǎn)左孩子節(jié)點(diǎn)入棧。重復(fù)執(zhí)行此操作,直到節(jié)點(diǎn)左孩子節(jié)點(diǎn)為空。取棧頂元素,并賦值給P,如果P的右孩子為空或P的右孩子等于q(即如果p的右孩子已訪問,則訪問根節(jié)點(diǎn),即p指向的節(jié)點(diǎn),并用q來記錄剛剛訪問的節(jié)點(diǎn)的指針),若p有右孩子,且右孩子沒有別訪問過,則p=p-rchild。操作函數(shù)為void h_print(Tree T)3.源代碼#include#include#include#include#include using namespace

10、 std;typedef string nametype;typedef unsigned long keytype;typedef struct node /結(jié)點(diǎn)的結(jié)構(gòu)體keytype key; nametype name; int grade;struct node *lchild,*rchild;bstnode;typedef bstnode *bstree;/棧的定義/typedef struct /棧結(jié)構(gòu)bstree *base;bstree *top;int stacksize;Sqstack;int InitStack (Sqstack &s) /建立一個(gè)空棧s.base=(bs

11、tree*)malloc(1000 * sizeof(int);s.top=s.base;return 1;int Push(Sqstack &s ,node *e)/在棧頂插入元素(進(jìn)棧)*s.top=e;s.top=s.top+1;return 1;int Pop(Sqstack &s, bstree &e)/出棧if(s.top=s.base)return 0;else s.top=s.top-1;e=*s.top;return 1;/非遞歸歷遍并輸出結(jié)點(diǎn)信息/*-先序非遞歸遍歷-*/void x_print(node *t)Sqstack s;InitStack(s);bstnode

12、*p;p=t;while(p|!(s.top=s.base)if(p) Push(s,p);coutkeytsetw(20);coutnametsetw(20);coutgradetlchild;else Pop(s,p);p=p-rchild;/*-中序非遞歸遍歷-*/void z_print(node *t)Sqstack s;InitStack(s);bstnode *p;p=t;while(p|!(s.top=s.base)if(p) Push(s,p);p=p-lchild;else Pop(s,p);coutkeytsetw(20);coutnametsetw(20);coutgr

13、adetrchild;/*-非遞歸后序遍歷-*/void h_print(node *t)Sqstack s; InitStack(s);node *p,*q;p=t;q=NULL; while(p | !(s.top=s.base)if(p)Push(s,p); p=p-lchild; else p=*(s.top-1); if(p-rchild=q) Pop(s,q);p=NULL; coutkeytsetw(20);coutnametsetw(20);coutgradetrchild;q=NULL; /遞歸查找二叉樹/ /*-歸查找,若找到就返回指向該結(jié)點(diǎn)的指針,否則返回空-*/bstn

14、ode *SearchBST(bstree t,keytype key) if(t=NULL|key=t-key)return t;if(keykey)return SearchBST(t-lchild ,key);else return SearchBST(t-rchild ,key);/-給定學(xué)生信息插入到二叉樹中-/bstree InsertBST(bstree t,int key,nametype name,double grade)bstree p,q;if(t=NULL) /樹初始為空,新建二叉樹t=new bstnode();t-key=key; t-name=name;t-gr

15、ade=grade;t-lchild=t-rchild=NULL;elsep=t;while(p) /樹已存在,按照二叉排序樹的特性查找q=p;if(p-keykey)p=q-lchild;else if(p-keyrchild;elsecoutendl;cout樹中已有該節(jié)點(diǎn):keyendl;coutkey=key;p-name=name;p-grade=grade;p-lchild=p-rchild=NULL;if(q-keykey)q-lchild=p;elseq-rchild=p;return t;/-二叉樹排序樹的構(gòu)建-/bstree CreatTree() /不斷輸入學(xué)生信息以插入

16、到二叉樹中bstree t=NULL;keytype key;nametype name;double grade;cout請(qǐng)輸入-學(xué)號(hào)-姓名-成績(jī)-(輸入0時(shí)結(jié)束):key;if(key=0)return t;cinname;cingrade;while(key) /key=0時(shí)退出t=InsertBST(t,key,name,grade);cout請(qǐng)輸入-學(xué)號(hào)-姓名-成績(jī)-(輸入0時(shí)結(jié)束):key;if(key=0)break;cinname; cingrade;return t;/-刪除樹中的結(jié)點(diǎn)-/void Delete(bstree &p) /刪除結(jié)點(diǎn)的函數(shù)bstree q,s;if

17、(!p-rchild)q=p;p=q-lchild ;delete q;else if(!p-lchild)q=p;p=p-rchild;delete q;else q=p;s=p-lchild;while(s-rchild)q=s;s=s-rchild;p-name=s-name;if(q!=p)q-rchild=s-lchild;elseq-lchild=s-lchild;delete s;void DeleteData(bstree &t,keytype key)if(!t)coutkey;DeleteData(t,key);elseif(t-key=key)Delete(t); /若找

18、到結(jié)點(diǎn)直接刪除cout刪除成功!keykey)DeleteData(t-lchild,key); /結(jié)點(diǎn)數(shù)據(jù)比查找關(guān)鍵字大,繼續(xù)在其左子樹中查找elseDeleteData(t-rchild,key); /結(jié)點(diǎn)數(shù)據(jù)比查找關(guān)鍵字小,繼續(xù)在其右子樹中查找/數(shù)組和二叉排序樹的查找效率比較/void compare()bstree t=NULL;clock_t start,end,start1,end1;int num=0;int a=0;int b=0;int c=0;int d=1;bstree p;string key,name;double grade;nametype str 1003;/c

19、out(輸入0時(shí)結(jié)束)endl;cout請(qǐng)輸入-學(xué)號(hào)-姓名-成績(jī)-(輸入0時(shí)結(jié)束):key;if(key=0) return ;cinname;cingrade;while(key!=0)strnum0=key;strnum1=name;strnum2=grade;int key1=atoi(key.c_str(); /用庫函數(shù)將字符串轉(zhuǎn)化為關(guān)鍵字的int型t=InsertBST(t,key1,name,grade); /插入結(jié)點(diǎn)cout請(qǐng)輸入-學(xué)號(hào)-姓名-成績(jī)-(輸入0時(shí)結(jié)束):key;if(key=0)break;cinname;cingrade;num+;coutendl; coutd;

20、while(d!=NULL) switch(d) case 0: cout返回選擇界面endl;break; case 1:cout數(shù)組查詢!endl;cout請(qǐng)輸入查詢的成績(jī):key;start=clock();while(a=10000000) /循環(huán)模擬數(shù)組查找while(b=100)cout數(shù)組查詢:無查詢信息,花費(fèi)時(shí)間: end-start 毫秒endl;elsecout數(shù)組查詢:查到信息,花費(fèi)時(shí)間: end-start 毫秒endl;int key1=atoi(key.c_str(); /同上轉(zhuǎn)化start1=clock();while(c=10000000) /用循環(huán)來模擬樹中查

21、找p=SearchBST(t,key1);c+;end1=clock();if(p=NULL)cout樹查詢:無查詢信息,花費(fèi)時(shí)間: end1-start1 毫秒endl;else cout樹查詢:查到信息,花費(fèi)時(shí)間: end1-start1 毫秒endl;a=0;b=0;c=0;break; coutd;/二叉樹的深度int TreeDepth(bstree t)int left,right,max;if(t!=NULL)left=TreeDepth(t-lchild);right=TreeDepth(t-rchild);max=leftright?left:right;return max

22、+1;elsereturn 0;/樹狀輸出二叉樹void PrintTree(bstree t,int layer)int k;if(t=NULL)return ;PrintTree(t-rchild,layer+1);for(k=0;klayer;k+)cout ;coutkeylchild,layer+1);/-主函數(shù)測(cè)試-/int main()int d; keytype key;bstree t=NULL; t=CreatTree();d=TreeDepth(t);cout二叉排序樹的樹形表示如下endl; PrintTree(t,d);char choose;nametype nam

23、e;bstree p;double grade; cout endl;cout-請(qǐng)輸入你要選擇的操作-endl;cout |-|endl;cout |-|endl;cout | a 插入信息 |endl;cout | b 刪除信息 |endl;cout | c 查詢信息 |endl;cout | d 修改信息 |endl;cout | 0 退出 |endl;cout | e 對(duì)二叉排序樹進(jìn)行非遞歸遍歷 |endl;cout | f 進(jìn)行數(shù)組和二叉樹查找效率實(shí)驗(yàn)|endl;cout |-|endl;cout |-|endl;coutendl;coutchoose;coutendl;while(c

24、hoose)switch(choose)case a:/cout輸入學(xué)生信息信息(學(xué)號(hào)為0時(shí)結(jié)束).endl;cout請(qǐng)輸入-學(xué)號(hào)-姓名-成績(jī)-(輸入0時(shí)結(jié)束):key;if(key=0) /*PrintTree(t,d);break;*/cinname;cingrade;while(key) t=InsertBST(t,key,name,grade);cout請(qǐng)輸入-學(xué)號(hào)-姓名-成績(jī)-:key;if(key=0)break;cinname; cingrade;break;case b:cout請(qǐng)輸入要?jiǎng)h除信息學(xué)生的成績(jī):key;DeleteData(t,key); d=TreeDepth(t

25、); cout刪除結(jié)點(diǎn)后二叉樹的樹形顯示如下endl; PrintTree(t,d);break;case c:cout請(qǐng)輸入要查詢的成績(jī):key;p=SearchBST(t,key);if(p=NULL)cout無查詢的關(guān)鍵字:keyendl;elsecout成績(jī)tsetw(20)姓名tsetw(20)學(xué)號(hào)endl; coutkeytsetw(20);coutnametsetw(20); coutgradeendl;break;case d:cout請(qǐng)輸入要修改的學(xué)號(hào):key;p=SearchBST(t,key);if(p=NULL)cout無你所要修改的關(guān)鍵字:keyendl;elsecoutname;coutgrade;p-name=name;p-grade=grade;break;case e:if(!t)cout沒有任何信息,請(qǐng)先輸入信息!;elsecout學(xué)號(hào)tsetw(20)姓名tsetw(20)成績(jī)endl;cout-非遞歸先序遍歷-endl;coutendl;x_print(t);cout-非遞歸中序遍歷-endl;coutendl;z_print(t);cout-非遞歸后序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論