版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì)</b></p><p> 課程名稱 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p> 題目名稱 二叉排序樹的實(shí)現(xiàn) </p><p> 學(xué) 院 應(yīng)用數(shù)學(xué)學(xué)院 </p><p> 專業(yè)班級(jí) </p><p>
2、 學(xué) 號(hào) </p><p> 學(xué)生姓名 </p><p> 指導(dǎo)教師 </p><p> 2013 年 12 月 26 日</p><p><b> 1.設(shè)計(jì)任務(wù)</b></p><p> 實(shí)現(xiàn)二叉排序樹,包
3、括生成、插入,刪除;</p><p> 對(duì)二叉排序樹進(jìn)行先根、中根、和后根非遞歸遍歷;</p><p> 每次對(duì)樹的修改操作和遍歷操作的顯示結(jié)果都需要在屏幕上</p><p> 用樹的形狀表示出來(lái)。</p><p> 分別用二叉排序樹和數(shù)組去存儲(chǔ)一個(gè)班(50人以上)的成員信 </p><
4、;p> 息(至少包括學(xué)號(hào)、姓名、成績(jī)3項(xiàng)),對(duì)比查找效率,并說(shuō)明 </p><p> 為什么二叉排序樹效率高(或者低)。</p><p><b> 2. 函數(shù)模塊:</b></p><p> 2.1.主函數(shù)main模塊功能</p><p> 1.通過(guò)bstree CreatTree()操作建立二叉排
5、序樹。 </p><p> 2.在二叉排序樹t中通過(guò)操作bstree InsertBST(bstree t,int </p><p> key,nametype name,double grade)插入一個(gè)節(jié)點(diǎn)。</p><p> 3. 從二叉排序樹t中通過(guò)操作void Delete(bstree &p)刪除任意節(jié)點(diǎn)。</p><
6、;p> 4. 在二叉排序樹t中通過(guò)操作bstnode *SearchBST(bstree t,keytype key)查找節(jié)點(diǎn)。</p><p> 5. 在二叉排序樹t中通過(guò)操作p=SearchBST(t,key)查詢,并修改節(jié)點(diǎn)信息</p><p> 6. 非遞歸遍歷二叉排序樹。</p><p> 7. 定義函數(shù)void compare()對(duì)數(shù)組和二
7、叉排序樹的查找效率進(jìn)行比較比較。</p><p> 2.2創(chuàng)建二叉排序樹CreatTree模塊</p><p> 從鍵盤中輸入關(guān)鍵字及記錄,并同時(shí)調(diào)用插入函數(shù)并不斷進(jìn)行插入。最后,返回根節(jié)點(diǎn)T。</p><p><b> 2.3刪除模塊:</b></p><p> 二叉排序樹上刪除一個(gè)階段相當(dāng)于刪去有序系列中的一
8、個(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的左子樹,而*p的右子樹為
9、*s的右子樹,其二可以令*p的直接前驅(qū)(或直接后繼)替代*p,然后再?gòu)亩媾判驑渲袆h去它的直接前驅(qū)(或直接后繼)。在二叉排序樹中刪除一個(gè)節(jié)點(diǎn)的算法為</p><p> void DeleteData(bstree &t,keytype key)</p><p> 若二叉排序樹t中存在關(guān)鍵字等于key的數(shù)據(jù)元素,則刪除該數(shù)據(jù)元素節(jié)點(diǎn),并返回TRUE,否則返回FALSE。</
10、p><p><b> 2.4插入模塊</b></p><p> 二叉排序樹是一種動(dòng)態(tài)樹表,其特點(diǎn)是樹的結(jié)構(gòu)通常不是一次生成的,而是在查找的過(guò)程中,當(dāng)樹中不存在關(guān)鍵字等于給定值得節(jié)點(diǎn)時(shí)在進(jìn)行插入。新插入的節(jié)點(diǎn)一定是一個(gè)新添加的葉子節(jié)點(diǎn),并且是查找不成功時(shí)查找路徑上訪問(wèn)的最后一個(gè)節(jié)點(diǎn)的左孩子或右孩子的節(jié)點(diǎn)。一個(gè)無(wú)序系列可以通過(guò)構(gòu)造一棵二叉排序樹而變成一個(gè)有序系列,構(gòu)造樹的
11、過(guò)程即為對(duì)無(wú)序系列進(jìn)行排序的過(guò)程, 并且每次插入的節(jié)點(diǎn)都是二叉排序樹上新的葉子節(jié)點(diǎn),則在進(jìn)行插入操作時(shí),不必移動(dòng)其他節(jié)點(diǎn),僅需改變某個(gè)節(jié)點(diǎn)的指針由空變?yōu)榉强占纯?。二叉排序樹的插入算法?lt;/p><p> bstree InsertBST(bstree t,int key,nametype name,double grade)</p><p> 若二叉排序樹中不存在關(guān)鍵字等于key的數(shù)據(jù)
12、元素時(shí),插入元素并返回TRUE。</p><p><b> 2.5查找模塊</b></p><p> 二叉排序樹又稱二叉查找樹,當(dāng)二叉排序樹不為空時(shí),首先將給定的值和根節(jié)點(diǎn)的關(guān)鍵字比較,若相等則查找成功,否則將依據(jù)給定的值和根節(jié)點(diǎn)關(guān)鍵字之間的大小關(guān)系,分別在左子樹或右子樹上繼續(xù)進(jìn)行查找。為此定義一個(gè)二叉排序樹的查找算法為</p><p>
13、 bstnode *SearchBST(bstree t,keytype key) </p><p> 在根指針t所指向的二叉排序樹中查找關(guān)鍵字等于key的數(shù)據(jù)元素,如成功,返回指向該元素節(jié)點(diǎn)的指針,否則返回空指針。</p><p> 2.6效率比較compare模塊</p><p> void compare()對(duì)數(shù)組和二叉排序樹的查找效率進(jìn)行比較比較。
14、</p><p> 2.7二叉排序樹的遍歷</p><p> 先序遍歷也叫做先根遍歷。首先訪問(wèn)根結(jié)點(diǎn)然后遍歷左子樹,最后遍歷右子樹。在遍歷左、右子樹時(shí),仍然先訪問(wèn)根結(jié)點(diǎn),然后遍歷左子樹,最后遍歷右子樹,如果二叉樹為空則返回。其實(shí)過(guò)程為:先遍歷左子樹root->left->left->left...->null,由于是先序遍歷,因此一遇到節(jié)點(diǎn),便需要立即訪問(wèn);由于
15、一直走到最左邊后,需要逐步返回到父節(jié)點(diǎn)訪問(wèn)右節(jié)點(diǎn),因此必須有一個(gè)措施能夠?qū)?jié)點(diǎn)序列回溯。其一可以用棧記憶在訪問(wèn)途中將依次遇到的節(jié)點(diǎn)保存下來(lái)。根據(jù)棧的先進(jìn)后出、后進(jìn)先出的特點(diǎn)特點(diǎn)。則可以用棧保存。每次都將遇到的節(jié)點(diǎn)壓入棧,當(dāng)左子樹遍歷完畢后從棧中彈出最后一個(gè)訪問(wèn)的節(jié)點(diǎn),然后訪問(wèn)其右子樹。</p><p><b> 基本算法思想:</b></p><p> 1.先訪問(wèn)
16、根節(jié)點(diǎn),將根節(jié)點(diǎn)入棧</p><p> 2.重復(fù)執(zhí)行兩大步驟:如果該節(jié)點(diǎn)左孩子存在,則訪問(wèn)該左孩子節(jié)點(diǎn),并將其指針入棧。重復(fù)以上操作,直到節(jié)點(diǎn)的左孩子不存在。將棧頂?shù)脑?,即其指針出棧,回到父?jié)點(diǎn),如果該指針節(jié)點(diǎn)的右孩子存在,則將該指針指向的右孩子節(jié)點(diǎn)重復(fù)執(zhí)行以上步驟,直到桟為空為止。</p><p> 操作函數(shù)為void x_print(Tree T)</p><
17、p> 中序遍歷:中序遍歷和先序遍歷訪問(wèn)的順序不同。中序遍歷訪問(wèn)順序?yàn)橹行虮闅v左子數(shù),在訪問(wèn)根節(jié)點(diǎn),最后中序遍歷右子樹。先序遍歷是先訪問(wèn),再入棧;而中序遍歷則是先入棧,彈棧后再訪問(wèn)。將二叉樹的根節(jié)點(diǎn)入棧,如果該節(jié)點(diǎn)有左孩子,將左孩子直接入棧,重復(fù)該操作,直到該節(jié)點(diǎn)無(wú)左孩子;在將棧頂元素出棧,并訪問(wèn)該節(jié)點(diǎn)指向的節(jié)點(diǎn),如果該指針指向的右孩子存在,則將當(dāng)前指針指向右孩子節(jié)點(diǎn)。重復(fù)執(zhí)行步驟直到棧為空為止。</p><p
18、> 操作函數(shù)為void z_print(Tree T )。</p><p> 后序遍歷:先后序遍歷左子樹,在后序遍歷右子樹,最后訪問(wèn)根節(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的右孩子已訪問(wèn),則訪問(wèn)根節(jié)點(diǎn),即p指向的節(jié)點(diǎn),并用q來(lái)記錄剛剛訪問(wèn)的節(jié)點(diǎn)的指針),若p有右
19、孩子,且右孩子沒(méi)有別訪問(wèn)過(guò),則p=p->rchild。</p><p> 操作函數(shù)為void h_print(Tree T)</p><p><b> 3.源代碼</b></p><p> #include<stdio.h></p><p> #include<iostream>
20、</p><p> #include<string></p><p> #include<time.h></p><p> #include <iomanip></p><p> using namespace std;</p><p> typedef string n
21、ametype;</p><p> typedef unsigned long keytype;</p><p> typedef struct node //結(jié)點(diǎn)的結(jié)構(gòu)體</p><p><b> {</b></p><p> keytype key; </p>
22、<p> nametype name; </p><p> int grade;</p><p> struct node *lchild,*rchild;</p><p><b> }bstnode;</b></p><p> typedef bstnode *bstree;</
23、p><p><b> //棧的定義//</b></p><p> typedef struct{ //棧結(jié)構(gòu)</p><p> bstree *base;</p><p> bstree *top;</p><p> int stacksize;</p>
24、<p><b> }Sqstack;</b></p><p> int InitStack (Sqstack &s) //建立一個(gè)空棧</p><p><b> {</b></p><p> s.base=(bstree*)malloc(1000 * sizeof(int));</p>
25、;<p> s.top=s.base;</p><p><b> return 1;</b></p><p><b> };</b></p><p> int Push(Sqstack &s ,node *e)//在棧頂插入元素(進(jìn)棧)</p><p><b>
26、; {</b></p><p><b> *s.top=e;</b></p><p> s.top=s.top+1;</p><p><b> return 1;</b></p><p><b> };</b></p><p>
27、int Pop(Sqstack &s, bstree &e)//出棧</p><p><b> {</b></p><p> if(s.top==s.base)return 0;</p><p> else s.top=s.top-1;</p><p><b> e=*s.top;<
28、;/b></p><p><b> return 1;</b></p><p><b> };</b></p><p> //非遞歸歷遍并輸出結(jié)點(diǎn)信息//</p><p> /*---------------先序非遞歸遍歷---------------*/</p><
29、;p> void x_print(node *t)</p><p><b> {</b></p><p> Sqstack s;</p><p> InitStack(s);</p><p> bstnode *p;</p><p><b> p=t;</b>
30、;</p><p> while(p||!(s.top==s.base))</p><p><b> {</b></p><p><b> if(p)</b></p><p><b> { </b></p><p> Push(s,p);<
31、;/p><p> cout<<p->key<<"\t"<<setw(20);</p><p> cout<<p->name<<"\t"<<setw(20);</p><p> cout<<p->grade<<&q
32、uot;\t"<<endl;</p><p> p=p->lchild;</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p><
33、;b> Pop(s,p);</b></p><p> p=p->rchild;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*-
34、--------------中序非遞歸遍歷---------------*/</p><p> void z_print(node *t)</p><p><b> {</b></p><p> Sqstack s;</p><p> InitStack(s);</p><p> bst
35、node *p;</p><p><b> p=t;</b></p><p> while(p||!(s.top==s.base))</p><p><b> {</b></p><p><b> if(p)</b></p><p><b&
36、gt; { </b></p><p> Push(s,p);</p><p> p=p->lchild;</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b>
37、;</p><p><b> Pop(s,p);</b></p><p> cout<<p->key<<"\t"<<setw(20);</p><p> cout<<p->name<<"\t"<<setw(20);&
38、lt;/p><p> cout<<p->grade<<"\t"<<endl;</p><p> p=p->rchild;</p><p><b> }</b></p><p><b> }</b></p><
39、p><b> }</b></p><p> /*---------------非遞歸后序遍歷---------------*/</p><p> void h_print(node *t)</p><p><b> {</b></p><p> Sqstack s;</p>
40、;<p> InitStack(s);</p><p> node *p,*q;</p><p><b> p=t;</b></p><p><b> q=NULL;</b></p><p> while(p || !(s.top==s.base))</p>
41、<p><b> {</b></p><p><b> if(p){</b></p><p> Push(s,p);</p><p> p=p->lchild;</p><p><b> }else</b></p><p>&l
42、t;b> {</b></p><p> p=*(s.top-1);</p><p> if(p->rchild==q)</p><p><b> {</b></p><p> Pop(s,q);p=NULL;</p><p> cout<<q->
43、;key<<"\t"<<setw(20);</p><p> cout<<q->name<<"\t"<<setw(20);</p><p> cout<<q->grade<<"\t"<<endl;</p>
44、<p><b> }else</b></p><p><b> {</b></p><p> p=p->rchild;q=NULL;</p><p><b> }</b></p><p><b> }</b></p>
45、<p><b> }</b></p><p><b> }</b></p><p> //遞歸查找二叉樹//</p><p> /*---歸查找,若找到就返回指向該結(jié)點(diǎn)的指針,否則返回空---*/</p><p> bstnode *SearchBST(bstree t,ke
46、ytype key) {</p><p> if(t==NULL||key==t->key)</p><p><b> return t;</b></p><p> if(key<t->key)</p><p> return SearchBST(t->lchild ,key);<
47、;/p><p><b> else </b></p><p> return SearchBST(t->rchild ,key);</p><p><b> }</b></p><p> //-------------------給定學(xué)生信息插入到二叉樹中-----------------
48、--//</p><p> bstree InsertBST(bstree t,int key,nametype name,double grade)</p><p><b> {</b></p><p> bstree p,q;</p><p> if(t==NULL) //樹初始為
49、空,新建二叉樹</p><p><b> {</b></p><p> t=new bstnode();</p><p> t->key=key;</p><p> t->name=name;</p><p> t->grade=grade;</p>&l
50、t;p> t->lchild=t->rchild=NULL;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> p=t;</b>&l
51、t;/p><p> while(p) //樹已存在,按照二叉排序樹的特性查找</p><p><b> {</b></p><p><b> q=p;</b></p><p> if(p->key>key)</p><p> p=q->
52、lchild;</p><p> else if(p->key<key)</p><p> p=q->rchild;</p><p><b> else</b></p><p><b> {</b></p><p> cout<<end
53、l;</p><p> cout<<"樹中已有該節(jié)點(diǎn):"<<key<<endl;</p><p> cout<<endl;</p><p><b> return t;</b></p><p><b> }</b></
54、p><p><b> }</b></p><p> p=new bstnode(); //找不到結(jié)點(diǎn)就新建一個(gè)結(jié)點(diǎn)插入到二叉排序樹中</p><p> p->key=key;</p><p> p->name=name;</p><p> p->grade=gr
55、ade;</p><p> p->lchild=p->rchild=NULL;</p><p> if(q->key>key)</p><p> q->lchild=p;</p><p><b> else</b></p><p> q->rchild
56、=p;</p><p><b> }</b></p><p><b> return t;</b></p><p><b> }</b></p><p> //-------------------二叉樹排序樹的構(gòu)建-------------------//</p
57、><p> bstree CreatTree() //不斷輸入學(xué)生信息以插入到二叉樹中</p><p><b> {</b></p><p> bstree t=NULL;</p><p> keytype key;</p><p> nametype name;</
58、p><p> double grade;</p><p> cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b> cin>>key;</b></p><p> if(key==0)</p>
59、;<p><b> return t;</b></p><p> cin>>name;</p><p> cin>>grade;</p><p> while(key) //key==0時(shí)退出</p><p><b> {</b><
60、/p><p> t=InsertBST(t,key,name,grade);</p><p> cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b> cin>>key;</b></p><p> i
61、f(key==0)</p><p><b> break;</b></p><p> cin>>name;</p><p> cin>>grade;</p><p><b> }</b></p><p><b> return t;
62、</b></p><p><b> }</b></p><p> //-------------------刪除樹中的結(jié)點(diǎn)-------------------//</p><p> void Delete(bstree &p) //刪除結(jié)點(diǎn)的函數(shù)</p><p><b>
63、{</b></p><p> bstree q,s;</p><p> if(!p->rchild)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=q->lchild ;</p&
64、gt;<p><b> delete q;</b></p><p><b> }</b></p><p> else if(!p->lchild)</p><p><b> {</b></p><p><b> q=p;</b>
65、;</p><p> p=p->rchild;</p><p><b> delete q;</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b&
66、gt;</p><p><b> q=p;</b></p><p> s=p->lchild;</p><p> while(s->rchild)</p><p><b> {</b></p><p><b> q=s;</b>&l
67、t;/p><p> s=s->rchild;</p><p><b> }</b></p><p> p->name=s->name;</p><p><b> if(q!=p)</b></p><p> q->rchild=s->lchi
68、ld;</p><p><b> else</b></p><p> q->lchild=s->lchild;</p><p><b> delete s;</b></p><p><b> }</b></p><p><b&g
69、t; }</b></p><p> void DeleteData(bstree &t,keytype key)</p><p><b> {</b></p><p><b> if(!t){</b></p><p> cout<<"沒(méi)有該信息,請(qǐng)
70、重新輸入!";</p><p><b> cin>>key;</b></p><p> DeleteData(t,key);</p><p><b> }</b></p><p><b> else</b></p><p>
71、<b> {</b></p><p> if(t->key==key)</p><p><b> {</b></p><p> Delete(t); //若找到結(jié)點(diǎn)直接刪除</p><p> cout<<"刪除成功!"<<endl;
72、</p><p><b> }</b></p><p> else if(t->key>key)</p><p> DeleteData(t->lchild,key); //結(jié)點(diǎn)數(shù)據(jù)比查找關(guān)鍵字大,繼續(xù)在其左子樹中查找</p><p><b> else</b><
73、;/p><p> DeleteData(t->rchild,key); //結(jié)點(diǎn)數(shù)據(jù)比查找關(guān)鍵字小,繼續(xù)在其右子樹中查找</p><p><b> }</b></p><p><b> }</b></p><p> //數(shù)組和二叉排序樹的查找效率比較//</p><
74、p> void compare()</p><p><b> {</b></p><p> bstree t=NULL;</p><p> clock_t start,end,start1,end1;</p><p> int num=0;</p><p><b>
75、int a=0;</b></p><p><b> int b=0;</b></p><p><b> int c=0;</b></p><p><b> int d=1;</b></p><p><b> bstree p;</b>&
76、lt;/p><p> string key,name;</p><p> double grade;</p><p> nametype str [100][3];</p><p> //cout<<"(輸入0時(shí)結(jié)束)"<<endl;</p><p> cout<
77、<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b> cin>>key;</b></p><p> if(key=="0")</p><p><b> return ;</b></p>
78、;<p> cin>>name;</p><p> cin>>grade;</p><p> while(key!="0")</p><p><b> {</b></p><p> str[num][0]=key;</p><p>
79、; str[num][1]=name;</p><p> str[num][2]=grade;</p><p> int key1=atoi(key.c_str()); //用庫(kù)函數(shù)將字符串轉(zhuǎn)化為關(guān)鍵字的int型</p><p> t=InsertBST(t,key1,name,grade); //插入結(jié)點(diǎn)</p><p>
80、cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b> cin>>key;</b></p><p> if(key=="0")</p><p><b> break;</b><
81、;/p><p> cin>>name;</p><p> cin>>grade;</p><p><b> num++;</b></p><p><b> }</b></p><p> cout<<endl;</p>&
82、lt;p> cout<<"進(jìn)行數(shù)組和二叉排序樹的查詢效率比較(比較:1 不比較:0)";</p><p><b> cin>>d;</b></p><p> while(d!=NULL)</p><p><b> {</b></p><p>
83、;<b> switch(d)</b></p><p><b> {</b></p><p><b> case 0: </b></p><p> cout<<"返回選擇界面"<<endl;</p><p><b>
84、 break;</b></p><p><b> case 1:</b></p><p> cout<<"數(shù)組查詢!"<<endl;</p><p> cout<<"請(qǐng)輸入查詢的成績(jī):"<<endl;</p><p&g
85、t;<b> cin>>key;</b></p><p> start=clock();</p><p> while(a<=10000000) //循環(huán)模擬數(shù)組查找</p><p><b> {</b></p><p> while(b<=99)
86、</p><p><b> {</b></p><p> if(str[b][0]==key)</p><p><b> {b=100;}</b></p><p><b> else</b></p><p><b> b++;<
87、/b></p><p><b> }</b></p><p><b> b=0;</b></p><p><b> a++;</b></p><p><b> }</b></p><p> end=clock();&
88、lt;/p><p> if(num>=100)</p><p> cout<<"數(shù)組查詢:無(wú)查詢信息,花費(fèi)時(shí)間: "<<end-start<<" 毫秒"<<endl;</p><p><b> else</b></p><p&g
89、t; cout<<"數(shù)組查詢:查到信息,花費(fèi)時(shí)間: "<<end-start<<" 毫秒"<<endl;</p><p> int key1=atoi(key.c_str()); //同上轉(zhuǎn)化</p><p> start1=clock();</p><p> w
90、hile(c<=10000000) //用循環(huán)來(lái)模擬樹中查找</p><p><b> {</b></p><p> p=SearchBST(t,key1);</p><p><b> c++;</b></p><p><b> }</b></
91、p><p> end1=clock();</p><p> if(p==NULL)</p><p> cout<<"樹查詢:無(wú)查詢信息,花費(fèi)時(shí)間: "<<end1-start1<<" 毫秒"<<endl;</p><p><b> else
92、</b></p><p> cout<<"樹查詢:查到信息,花費(fèi)時(shí)間: "<<end1-start1<<" 毫秒"<<endl;</p><p><b> a=0;</b></p><p><b> b=0;</b>
93、</p><p><b> c=0;</b></p><p><b> break;</b></p><p><b> }</b></p><p> cout<<"是否繼續(xù)進(jìn)行操作(是:1 否:0):";</p><p
94、><b> cin>>d;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //二叉樹的深度</b></p><p> int TreeDepth(bstree t)
95、</p><p><b> {</b></p><p> int left,right,max;</p><p> if(t!=NULL)</p><p><b> {</b></p><p> left=TreeDepth(t->lchild);</p
96、><p> right=TreeDepth(t->rchild);</p><p> max=left>right?left:right;</p><p> return max+1;</p><p><b> }else</b></p><p><b> {</
97、b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //樹狀輸出二叉樹</b></p><p> void
98、 PrintTree(bstree t,int layer)</p><p><b> {</b></p><p><b> int k;</b></p><p> if(t==NULL)</p><p><b> return ;</b></p><
99、;p> PrintTree(t->rchild,layer+1);</p><p> for(k=0;k<layer;k++)</p><p> cout<<" ";</p><p> cout<<t->key<<"\n";</p><
100、;p> PrintTree(t->lchild,layer+1);</p><p><b> }</b></p><p> //-------------------主函數(shù)測(cè)試-------------------//</p><p> int main()</p><p><b> {&
101、lt;/b></p><p><b> int d;</b></p><p> keytype key;</p><p> bstree t=NULL;</p><p> t=CreatTree();</p><p> d=TreeDepth(t);</p><
102、p> cout<<"二叉排序樹的樹形表示如下"<<endl;</p><p> PrintTree(t,d);</p><p> char choose;</p><p> nametype name;</p><p><b> bstree p;</b><
103、;/p><p> double grade;</p><p> cout<<" "<<endl;</p><p> cout<<"-----------------------------請(qǐng)輸入你要選擇的操作-------------------------------"<<e
104、ndl;</p><p> cout<<" |-------------------------------------|"<<endl;</p><p> cout<<" ||----------------------------------
105、-||"<<endl;</p><p> cout<<" || a 插入信息 ||"<<endl;</p><p> cout<<" || b 刪除信息
106、 ||"<<endl;</p><p> cout<<" || c 查詢信息 ||"<<endl;</p><p> cout<<" || d
107、 修改信息 ||"<<endl;</p><p> cout<<" || 0 退出 ||"<<endl;</p><p> cout<<"
108、|| e 對(duì)二叉排序樹進(jìn)行非遞歸遍歷 ||"<<endl;</p><p> cout<<" || f 進(jìn)行數(shù)組和二叉樹查找效率實(shí)驗(yàn)||"<<endl;</p><p> cout<<" ||-------
109、----------------------------||"<<endl;</p><p> cout<<" |-------------------------------------|"<<endl;</p><p> cout<<endl;</p>
110、<p> cout<<"需要選擇的操作為:";</p><p> cin>>choose;</p><p> cout<<endl;</p><p> while(choose)</p><p><b> {</b></p><
111、;p> switch(choose)</p><p><b> {</b></p><p><b> case 'a':</b></p><p> //cout<<"輸入學(xué)生信息信息(學(xué)號(hào)為0時(shí)結(jié)束)."<<endl;</p><
112、p> cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---(輸入0時(shí)結(jié)束):"<<endl;</p><p><b> cin>>key;</b></p><p> if(key==0) /*{</p><p> PrintTree(t,d);</p>&l
113、t;p><b> break;}*/</b></p><p> cin>>name;</p><p> cin>>grade;</p><p> while(key) </p><p><b> {</b></p><p>
114、 t=InsertBST(t,key,name,grade);</p><p> cout<<"請(qǐng)輸入---學(xué)號(hào)---姓名---成績(jī)---:"<<endl;</p><p><b> cin>>key;</b></p><p> if(key==0)</p><
115、p><b> break;</b></p><p> cin>>name;</p><p> cin>>grade;</p><p><b> }</b></p><p><b> break;</b></p><p&
116、gt;<b> case 'b':</b></p><p> cout<<"請(qǐng)輸入要?jiǎng)h除信息學(xué)生的成績(jī):"<<endl;</p><p><b> cin>>key;</b></p><p> DeleteData(t,key);</p&
117、gt;<p> d=TreeDepth(t);</p><p> cout<<"刪除結(jié)點(diǎn)后二叉樹的樹形顯示如下"<<endl;</p><p> PrintTree(t,d);</p><p><b> break;</b></p><p><b&g
118、t; case 'c':</b></p><p> cout<<"請(qǐng)輸入要查詢的成績(jī):"<<endl;</p><p><b> cin>>key;</b></p><p> p=SearchBST(t,key);</p><p>
119、; if(p==NULL)</p><p> cout<<"無(wú)查詢的關(guān)鍵字:"<<key<<endl;</p><p><b> else</b></p><p> cout<<"成績(jī)"<<"\t"<<se
120、tw(20)<<"姓名"<<"\t"<<setw(20)<<"學(xué)號(hào)"<<endl;</p><p> cout<<p->key<<"\t"<<setw(20);</p><p> cout<<p
121、->name<<"\t"<<setw(20);</p><p> cout<<p->grade<<endl;</p><p><b> break;</b></p><p><b> case 'd':</b></p
122、><p> cout<<"請(qǐng)輸入要修改的學(xué)號(hào):"<<endl;</p><p><b> cin>>key;</b></p><p> p=SearchBST(t,key);</p><p> if(p==NULL)</p><p>
123、cout<<"無(wú)你所要修改的關(guān)鍵字:"<<key<<endl;</p><p><b> else</b></p><p><b> {</b></p><p> cout<<"請(qǐng)輸入修改的姓名:";</p><
124、;p> cin>>name;</p><p> cout<<"請(qǐng)輸入修改的成績(jī):";</p><p> cin>>grade;</p><p> p->name=name;</p><p> p->grade=grade;</p><p&g
125、t;<b> }</b></p><p><b> break;</b></p><p><b> case 'e':</b></p><p><b> if(!t)</b></p><p> cout<<"
126、沒(méi)有任何信息,請(qǐng)先輸入信息!";</p><p><b> else</b></p><p><b> {</b></p><p> cout<<"學(xué)號(hào)"<<"\t"<<setw(20)<<"姓名"&
127、lt;<"\t"<<setw(20)<<"成績(jī)"<<endl;</p><p> cout<<"------------------非遞歸先序遍歷----------------"<<endl;</p><p> cout<<endl;</p&
128、gt;<p> x_print(t);</p><p> cout<<"------------------非遞歸中序遍歷-----------------"<<endl;</p><p> cout<<endl;</p><p> z_print(t);</p><p
129、> cout<<"------------------非遞歸后序遍歷-----------------"<<endl;</p><p> cout<<endl;</p><p> h_print(t);</p><p><b> }</b></p><p&
130、gt;<b> break;</b></p><p><b> case 'f':</b></p><p> cout<<"***此實(shí)驗(yàn)為獨(dú)立實(shí)驗(yàn),實(shí)驗(yàn)數(shù)據(jù)獨(dú)立于外部數(shù)據(jù)***"<<endl;</p><p> cout<<"***請(qǐng)
131、重新輸入相關(guān)信息***"<<endl;</p><p> compare();</p><p><b> break;</b></p><p><b> default:</b></p><p> cout<<"選擇錯(cuò)誤!";</p
132、><p><b> break;</b></p><p><b> }</b></p><p> cout<<endl;</p><p> cout<<endl;</p><p> cout<<" "<<
133、;endl;</p><p> cout<<"-----------------------------請(qǐng)輸入你要選擇的操作-------------------------------"<<endl;</p><p> cout<<" |----------------------
134、---------------|"<<endl;</p><p> cout<<" ||-----------------------------------||"<<endl;</p><p> cout<<" ||
135、 a 插入信息 ||"<<endl;</p><p> cout<<" || b 刪除信息 ||"<<endl;</p><p> cout<<"
136、 || c 查詢信息 ||"<<endl;</p><p> cout<<" || d 修改信息 ||"<<endl;</p><p> cout<<"
137、 || 0 退出 ||"<<endl;</p><p> cout<<" || e 對(duì)二叉排序樹進(jìn)行非遞歸遍歷 ||"<<endl;</p><p> cout<<"
138、 || f 進(jìn)行數(shù)組和二叉樹查找效率實(shí)驗(yàn)||"<<endl;</p><p> cout<<" ||-----------------------------------||"<<endl;</p><p> cout<<&quo
139、t; |-------------------------------------|"<<endl;</p><p> cout<<endl;</p><p> cout<<"選擇的操作位:";</p><p> cin>>choose;<
140、/p><p> cout<<endl;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 4.運(yùn)行結(jié)果及截圖</b
141、></p><p><b> 從鍵盤讀入數(shù)據(jù)</b></p><p> 以0作為結(jié)束標(biāo)志可得二叉排序樹樹狀表示</p><p><b> 主菜單選擇模塊</b></p><p> 需要在樹種添加節(jié)點(diǎn)則執(zhí)行操作a</p><p> 需要在書中刪除節(jié)點(diǎn)執(zhí)行操作b&
142、lt;/p><p> 需要查詢節(jié)點(diǎn)信息執(zhí)行操作c</p><p> 修改某一節(jié)點(diǎn)信息執(zhí)行操作d</p><p> 執(zhí)行操作0退出程序執(zhí)行</p><p> 執(zhí)行操作e對(duì)樹進(jìn)行先序遍歷、后序遍歷、中序遍歷運(yùn)行結(jié)果如下圖</p><p> 需要對(duì)樹和數(shù)組的查詢效率比較執(zhí)行操作f</p><p>
143、; 4.實(shí)驗(yàn)結(jié)論 </p><p> 棧是僅表尾進(jìn)行插入和刪除的線性表,棧的順序存儲(chǔ)結(jié)構(gòu)是利用一組地址連續(xù)的存儲(chǔ)單元依次存放自棧底到棧頂?shù)臄?shù)據(jù)元素,并同時(shí)附設(shè)指針top指示棧頂元素在順序棧中的位置。</p><p> 從數(shù)組查詢和樹查詢的時(shí)間可得出,樹的查詢比數(shù)組的查詢時(shí)間快得多。但是二叉樹的平均查找長(zhǎng)度和樹的形態(tài)有關(guān),當(dāng)先后插入的關(guān)鍵字是有序樹時(shí),構(gòu)造的二叉樹蛻變?yōu)閱芜厴?/p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉排序樹的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-二叉排序樹的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)二叉排序樹課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(二叉排序樹的相關(guān)操作)
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--二叉排序樹調(diào)整為平衡二叉樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---二叉排序樹實(shí)現(xiàn)集合的運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉排序樹和平衡二叉樹的判別
- 課程設(shè)計(jì)--- 二叉排序樹的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---判別給定的二叉樹是否為二叉排序樹
- 數(shù)據(jù)結(jié)構(gòu)二叉排序樹的實(shí)現(xiàn)__(用順序和二叉鏈表作存儲(chǔ)結(jié)構(gòu)_)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-二叉排序樹的簡(jiǎn)單應(yīng)用報(bào)告
- 《二叉排序樹的操作》課程設(shè)計(jì)報(bào)告
- 二叉平衡樹的實(shí)現(xiàn)---數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 二叉樹數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 二叉排序樹實(shí)驗(yàn)
- 二叉排序樹實(shí)驗(yàn)
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹的應(yīng)用
- 二叉排序樹的實(shí)現(xiàn)(最終版)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹的遍歷
評(píng)論
0/150
提交評(píng)論