版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課 程 設 計</b></p><p> 課程名稱 數(shù)據結構課程設計 </p><p> 題目名稱 二叉排序樹的實現(xiàn) </p><p> 學 院 應用數(shù)學學院 </p><p> 專業(yè)班級 </p><p>
2、 學 號 </p><p> 學生姓名 </p><p> 指導教師 </p><p> 2013 年 12 月 26 日</p><p><b> 1.設計任務</b></p><p> 實現(xiàn)二叉排序樹,包
3、括生成、插入,刪除;</p><p> 對二叉排序樹進行先根、中根、和后根非遞歸遍歷;</p><p> 每次對樹的修改操作和遍歷操作的顯示結果都需要在屏幕上</p><p> 用樹的形狀表示出來。</p><p> 分別用二叉排序樹和數(shù)組去存儲一個班(50人以上)的成員信 </p><
4、;p> 息(至少包括學號、姓名、成績3項),對比查找效率,并說明 </p><p> 為什么二叉排序樹效率高(或者低)。</p><p><b> 2. 函數(shù)模塊:</b></p><p> 2.1.主函數(shù)main模塊功能</p><p> 1.通過bstree CreatTree()操作建立二叉排
5、序樹。 </p><p> 2.在二叉排序樹t中通過操作bstree InsertBST(bstree t,int </p><p> key,nametype name,double grade)插入一個節(jié)點。</p><p> 3. 從二叉排序樹t中通過操作void Delete(bstree &p)刪除任意節(jié)點。</p><
6、;p> 4. 在二叉排序樹t中通過操作bstnode *SearchBST(bstree t,keytype key)查找節(jié)點。</p><p> 5. 在二叉排序樹t中通過操作p=SearchBST(t,key)查詢,并修改節(jié)點信息</p><p> 6. 非遞歸遍歷二叉排序樹。</p><p> 7. 定義函數(shù)void compare()對數(shù)組和二
7、叉排序樹的查找效率進行比較比較。</p><p> 2.2創(chuàng)建二叉排序樹CreatTree模塊</p><p> 從鍵盤中輸入關鍵字及記錄,并同時調用插入函數(shù)并不斷進行插入。最后,返回根節(jié)點T。</p><p><b> 2.3刪除模塊:</b></p><p> 二叉排序樹上刪除一個階段相當于刪去有序系列中的一
8、個記錄,只要在刪除某個節(jié)點之后依舊保持二叉排序樹的性質即可。假設二叉排序樹上刪除節(jié)點為*p(指向節(jié)點的指針為p),其雙親節(jié)點為*f(節(jié)點指針為f)。若*p節(jié)點為葉子節(jié)點,則即左右均為空樹,由于刪去葉子節(jié)點不破壞整棵樹的結構,則只需修改其雙親節(jié)點的指針即可;若*p節(jié)點只有左子樹或只有右子樹,此時只要令左子樹或右子樹直接成為其雙親節(jié)點*f的左子樹即可;若*p節(jié)點的左子樹和右子樹均不為空,其一可以令*p的左子樹為*f的左子樹,而*p的右子樹為
9、*s的右子樹,其二可以令*p的直接前驅(或直接后繼)替代*p,然后再從二叉排序樹中刪去它的直接前驅(或直接后繼)。在二叉排序樹中刪除一個節(jié)點的算法為</p><p> void DeleteData(bstree &t,keytype key)</p><p> 若二叉排序樹t中存在關鍵字等于key的數(shù)據元素,則刪除該數(shù)據元素節(jié)點,并返回TRUE,否則返回FALSE。</
10、p><p><b> 2.4插入模塊</b></p><p> 二叉排序樹是一種動態(tài)樹表,其特點是樹的結構通常不是一次生成的,而是在查找的過程中,當樹中不存在關鍵字等于給定值得節(jié)點時在進行插入。新插入的節(jié)點一定是一個新添加的葉子節(jié)點,并且是查找不成功時查找路徑上訪問的最后一個節(jié)點的左孩子或右孩子的節(jié)點。一個無序系列可以通過構造一棵二叉排序樹而變成一個有序系列,構造樹的
11、過程即為對無序系列進行排序的過程, 并且每次插入的節(jié)點都是二叉排序樹上新的葉子節(jié)點,則在進行插入操作時,不必移動其他節(jié)點,僅需改變某個節(jié)點的指針由空變?yōu)榉强占纯伞6媾判驑涞牟迦胨惴?lt;/p><p> bstree InsertBST(bstree t,int key,nametype name,double grade)</p><p> 若二叉排序樹中不存在關鍵字等于key的數(shù)據
12、元素時,插入元素并返回TRUE。</p><p><b> 2.5查找模塊</b></p><p> 二叉排序樹又稱二叉查找樹,當二叉排序樹不為空時,首先將給定的值和根節(jié)點的關鍵字比較,若相等則查找成功,否則將依據給定的值和根節(jié)點關鍵字之間的大小關系,分別在左子樹或右子樹上繼續(xù)進行查找。為此定義一個二叉排序樹的查找算法為</p><p>
13、 bstnode *SearchBST(bstree t,keytype key) </p><p> 在根指針t所指向的二叉排序樹中查找關鍵字等于key的數(shù)據元素,如成功,返回指向該元素節(jié)點的指針,否則返回空指針。</p><p> 2.6效率比較compare模塊</p><p> void compare()對數(shù)組和二叉排序樹的查找效率進行比較比較。
14、</p><p> 2.7二叉排序樹的遍歷</p><p> 先序遍歷也叫做先根遍歷。首先訪問根結點然后遍歷左子樹,最后遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然后遍歷左子樹,最后遍歷右子樹,如果二叉樹為空則返回。其實過程為:先遍歷左子樹root->left->left->left...->null,由于是先序遍歷,因此一遇到節(jié)點,便需要立即訪問;由于
15、一直走到最左邊后,需要逐步返回到父節(jié)點訪問右節(jié)點,因此必須有一個措施能夠對節(jié)點序列回溯。其一可以用棧記憶在訪問途中將依次遇到的節(jié)點保存下來。根據棧的先進后出、后進先出的特點特點。則可以用棧保存。每次都將遇到的節(jié)點壓入棧,當左子樹遍歷完畢后從棧中彈出最后一個訪問的節(jié)點,然后訪問其右子樹。</p><p><b> 基本算法思想:</b></p><p> 1.先訪問
16、根節(jié)點,將根節(jié)點入棧</p><p> 2.重復執(zhí)行兩大步驟:如果該節(jié)點左孩子存在,則訪問該左孩子節(jié)點,并將其指針入棧。重復以上操作,直到節(jié)點的左孩子不存在。將棧頂?shù)脑?,即其指針出棧,回到父?jié)點,如果該指針節(jié)點的右孩子存在,則將該指針指向的右孩子節(jié)點重復執(zhí)行以上步驟,直到桟為空為止。</p><p> 操作函數(shù)為void x_print(Tree T)</p><
17、p> 中序遍歷:中序遍歷和先序遍歷訪問的順序不同。中序遍歷訪問順序為中序遍歷左子數(shù),在訪問根節(jié)點,最后中序遍歷右子樹。先序遍歷是先訪問,再入棧;而中序遍歷則是先入棧,彈棧后再訪問。將二叉樹的根節(jié)點入棧,如果該節(jié)點有左孩子,將左孩子直接入棧,重復該操作,直到該節(jié)點無左孩子;在將棧頂元素出棧,并訪問該節(jié)點指向的節(jié)點,如果該指針指向的右孩子存在,則將當前指針指向右孩子節(jié)點。重復執(zhí)行步驟直到棧為空為止。</p><p
18、> 操作函數(shù)為void z_print(Tree T )。</p><p> 后序遍歷:先后序遍歷左子樹,在后序遍歷右子樹,最后訪問根節(jié)點。先將根節(jié)點入棧,如果該節(jié)點左孩子節(jié)點存在,將該節(jié)點左孩子節(jié)點入棧。重復執(zhí)行此操作,直到節(jié)點左孩子節(jié)點為空。取棧頂元素,并賦值給P,如果P的右孩子為空或P的右孩子等于q(即如果p的右孩子已訪問,則訪問根節(jié)點,即p指向的節(jié)點,并用q來記錄剛剛訪問的節(jié)點的指針),若p有右
19、孩子,且右孩子沒有別訪問過,則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 //結點的結構體</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{ //棧結構</p><p> bstree *base;</p><p> bstree *top;</p><p> int stacksize;</p>
24、<p><b> }Sqstack;</b></p><p> int InitStack (Sqstack &s) //建立一個空棧</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)//在棧頂插入元素(進棧)</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> //非遞歸歷遍并輸出結點信息//</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> /*---歸查找,若找到就返回指向該結點的指針,否則返回空---*/</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> //-------------------給定學生信息插入到二叉樹中-----------------
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é)點:"<<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(); //找不到結點就新建一個結點插入到二叉排序樹中</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> //-------------------二叉樹排序樹的構建-------------------//</p
57、><p> bstree CreatTree() //不斷輸入學生信息以插入到二叉樹中</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<<"請輸入---學號---姓名---成績---(輸入0時結束):"<<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時退出</p><p><b> {</b><
60、/p><p> t=InsertBST(t,key,name,grade);</p><p> cout<<"請輸入---學號---姓名---成績---(輸入0時結束):"<<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> //-------------------刪除樹中的結點-------------------//</p><p> void Delete(bstree &p) //刪除結點的函數(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<<"沒有該信息,請
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); //若找到結點直接刪除</p><p> cout<<"刪除成功!"<<endl;
72、</p><p><b> }</b></p><p> else if(t->key>key)</p><p> DeleteData(t->lchild,key); //結點數(shù)據比查找關鍵字大,繼續(xù)在其左子樹中查找</p><p><b> else</b><
73、;/p><p> DeleteData(t->rchild,key); //結點數(shù)據比查找關鍵字小,繼續(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時結束)"<<endl;</p><p> cout<
77、<"請輸入---學號---姓名---成績---(輸入0時結束):"<<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()); //用庫函數(shù)將字符串轉化為關鍵字的int型</p><p> t=InsertBST(t,key1,name,grade); //插入結點</p><p>
80、cout<<"請輸入---學號---姓名---成績---(輸入0時結束):"<<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<<"進行數(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<<"請輸入查詢的成績:"<<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ù)組查詢:無查詢信息,花費時間: "<<end-start<<" 毫秒"<<endl;</p><p><b> else</b></p><p&g
89、t; cout<<"數(shù)組查詢:查到信息,花費時間: "<<end-start<<" 毫秒"<<endl;</p><p> int key1=atoi(key.c_str()); //同上轉化</p><p> start1=clock();</p><p> w
90、hile(c<=10000000) //用循環(huán)來模擬樹中查找</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<<"樹查詢:無查詢信息,花費時間: "<<end1-start1<<" 毫秒"<<endl;</p><p><b> else
92、</b></p><p> cout<<"樹查詢:查到信息,花費時間: "<<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ù)進行操作(是: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ù)測試-------------------//</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<<"-----------------------------請輸入你要選擇的操作-------------------------------"<<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 對二叉排序樹進行非遞歸遍歷 ||"<<endl;</p><p> cout<<" || f 進行數(shù)組和二叉樹查找效率實驗||"<<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<<"輸入學生信息信息(學號為0時結束)."<<endl;</p><
112、p> cout<<"請輸入---學號---姓名---成績---(輸入0時結束):"<<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<<"請輸入---學號---姓名---成績---:"<<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<<"請輸入要刪除信息學生的成績:"<<endl;</p><p><b> cin>>key;</b></p><p> DeleteData(t,key);</p&
117、gt;<p> d=TreeDepth(t);</p><p> cout<<"刪除結點后二叉樹的樹形顯示如下"<<endl;</p><p> PrintTree(t,d);</p><p><b> break;</b></p><p><b&g
118、t; case 'c':</b></p><p> cout<<"請輸入要查詢的成績:"<<endl;</p><p><b> cin>>key;</b></p><p> p=SearchBST(t,key);</p><p>
119、; if(p==NULL)</p><p> cout<<"無查詢的關鍵字:"<<key<<endl;</p><p><b> else</b></p><p> cout<<"成績"<<"\t"<<se
120、tw(20)<<"姓名"<<"\t"<<setw(20)<<"學號"<<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<<"請輸入要修改的學號:"<<endl;</p><p><b> cin>>key;</b></p><p> p=SearchBST(t,key);</p><p> if(p==NULL)</p><p>
123、cout<<"無你所要修改的關鍵字:"<<key<<endl;</p><p><b> else</b></p><p><b> {</b></p><p> cout<<"請輸入修改的姓名:";</p><
124、;p> cin>>name;</p><p> cout<<"請輸入修改的成績:";</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、沒有任何信息,請先輸入信息!";</p><p><b> else</b></p><p><b> {</b></p><p> cout<<"學號"<<"\t"<<setw(20)<<"姓名"&
127、lt;<"\t"<<setw(20)<<"成績"<<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ù)據獨立于外部數(shù)據***"<<endl;</p><p> cout<<"***請
131、重新輸入相關信息***"<<endl;</p><p> compare();</p><p><b> break;</b></p><p><b> default:</b></p><p> cout<<"選擇錯誤!";</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<<"-----------------------------請輸入你要選擇的操作-------------------------------"<<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 對二叉排序樹進行非遞歸遍歷 ||"<<endl;</p><p> cout<<"
138、 || f 進行數(shù)組和二叉樹查找效率實驗||"<<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.運行結果及截圖</b
141、></p><p><b> 從鍵盤讀入數(shù)據</b></p><p> 以0作為結束標志可得二叉排序樹樹狀表示</p><p><b> 主菜單選擇模塊</b></p><p> 需要在樹種添加節(jié)點則執(zhí)行操作a</p><p> 需要在書中刪除節(jié)點執(zhí)行操作b&
142、lt;/p><p> 需要查詢節(jié)點信息執(zhí)行操作c</p><p> 修改某一節(jié)點信息執(zhí)行操作d</p><p> 執(zhí)行操作0退出程序執(zhí)行</p><p> 執(zhí)行操作e對樹進行先序遍歷、后序遍歷、中序遍歷運行結果如下圖</p><p> 需要對樹和數(shù)組的查詢效率比較執(zhí)行操作f</p><p>
143、; 4.實驗結論 </p><p> 棧是僅表尾進行插入和刪除的線性表,棧的順序存儲結構是利用一組地址連續(xù)的存儲單元依次存放自棧底到棧頂?shù)臄?shù)據元素,并同時附設指針top指示棧頂元素在順序棧中的位置。</p><p> 從數(shù)組查詢和樹查詢的時間可得出,樹的查詢比數(shù)組的查詢時間快得多。但是二叉樹的平均查找長度和樹的形態(tài)有關,當先后插入的關鍵字是有序樹時,構造的二叉樹蛻變?yōu)閱芜厴?/p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據結構課程設計--二叉排序樹的實現(xiàn)
- 數(shù)據結構課程設計-二叉排序樹的實現(xiàn)
- 數(shù)據結構二叉排序樹課程設計報告
- 數(shù)據結構課程設計(二叉排序樹的相關操作)
- 《數(shù)據結構》課程設計--二叉排序樹調整為平衡二叉樹
- 數(shù)據結構課程設計報告---二叉排序樹實現(xiàn)集合的運算
- 數(shù)據結構課程設計---二叉排序樹和平衡二叉樹的判別
- 課程設計--- 二叉排序樹的實現(xiàn)
- 數(shù)據結構課程設計---判別給定的二叉樹是否為二叉排序樹
- 數(shù)據結構二叉排序樹的實現(xiàn)__(用順序和二叉鏈表作存儲結構_)課程設計
- 數(shù)據結構課程設計-二叉排序樹的簡單應用報告
- 《二叉排序樹的操作》課程設計報告
- 二叉平衡樹的實現(xiàn)---數(shù)據結構課程設計
- 二叉樹數(shù)據結構課程設計
- 二叉排序樹實驗
- 二叉排序樹實驗
- 《數(shù)據結構遍歷二叉樹》課程設計
- 數(shù)據結構課程設計----二叉樹的應用
- 二叉排序樹的實現(xiàn)(最終版)
- 數(shù)據結構課程設計--二叉樹的遍歷
評論
0/150
提交評論