




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)用文檔數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱(chēng):______二叉排序樹(shù)___________學(xué)生:____________________班級(jí):_______________班序號(hào):_______________________學(xué)號(hào):________________日期:________________
1.實(shí)驗(yàn)要求根據(jù)二叉排序樹(shù)的抽象數(shù)據(jù)類(lèi)型的定義,使用二叉鏈表實(shí)現(xiàn)一個(gè)二叉排序樹(shù)。二叉排序樹(shù)的基本功能:1.二叉排序樹(shù)的建立2.二叉排序樹(shù)的查找3.二叉排序樹(shù)的插入4.二叉排序樹(shù)的刪除5.二叉排序樹(shù)的銷(xiāo)毀6.其他:自定義操作編寫(xiě)測(cè)試main()函數(shù)測(cè)試二叉排序樹(shù)的正確性2.程序分析2.1存儲(chǔ)結(jié)構(gòu)二叉鏈表DataLchildRchildDataLchildRchild2.2程序流程(或程序結(jié)構(gòu)、或類(lèi)關(guān)系圖等表明程序構(gòu)成的容,一般為流程圖等)開(kāi)始2.2.1.流程圖開(kāi)始從文件讀取原始數(shù)據(jù)從文件讀取原始數(shù)據(jù)建立排序二叉樹(shù)建立排序二叉樹(shù)該元素和根節(jié)點(diǎn)數(shù)據(jù)比較大小該元素和根節(jié)點(diǎn)數(shù)據(jù)比較大小大小大小根節(jié)點(diǎn)移向右孩子根節(jié)點(diǎn)移向右孩子是根節(jié)點(diǎn)移向左孩子是根節(jié)點(diǎn)移向左孩子當(dāng)前根節(jié)點(diǎn)是否存在當(dāng)前根節(jié)點(diǎn)是否存在判斷下一個(gè)元素判斷下一個(gè)元素否否該元素節(jié)點(diǎn)插入到當(dāng)前根節(jié)點(diǎn)位置該元素節(jié)點(diǎn)插入到當(dāng)前根節(jié)點(diǎn)位置是是否還剩余元素是是否還剩余元素用戶輸入操作用戶輸入操作判斷操作判斷操作退出銷(xiāo)毀刪除插入查找退出銷(xiāo)毀刪除插入查找結(jié)束刪除該節(jié)點(diǎn)執(zhí)行查找操作執(zhí)行查找操作直到為空節(jié)點(diǎn)該元素和當(dāng)前根節(jié)點(diǎn)數(shù)據(jù)比較大小結(jié)束刪除該節(jié)點(diǎn)執(zhí)行查找操作執(zhí)行查找操作直到為空節(jié)點(diǎn)該元素和當(dāng)前根節(jié)點(diǎn)數(shù)據(jù)比較大小是是是否銷(xiāo)毀完刪除最終節(jié)點(diǎn)在該位置插入其節(jié)點(diǎn)是否銷(xiāo)毀完刪除最終節(jié)點(diǎn)在該位置插入其節(jié)點(diǎn)刪除下一節(jié)點(diǎn)小刪除下一節(jié)點(diǎn)小大大是否否是否否是否銷(xiāo)毀完是否銷(xiāo)毀完根節(jié)點(diǎn)移向左孩子根節(jié)點(diǎn)移向右孩子根節(jié)點(diǎn)移向左孩子根節(jié)點(diǎn)移向右孩子當(dāng)前根節(jié)點(diǎn)值是否相等當(dāng)前根節(jié)點(diǎn)值是否相等是是輸出該節(jié)點(diǎn)情況輸出該節(jié)點(diǎn)情況2.2.2.偽代碼從文件讀取待建樹(shù)元素建樹(shù),若待插入元素比根節(jié)點(diǎn)小,向左子樹(shù)前進(jìn)并重復(fù)比較左子樹(shù)根節(jié)點(diǎn),若待插入元素比根節(jié)點(diǎn)大,向右子樹(shù)前進(jìn)并重復(fù)比較右子樹(shù)根節(jié)點(diǎn),直至找到空節(jié)點(diǎn)則插入該元素,不斷插入直至不剩下元素。用戶選擇操作。若用戶選擇查找,則現(xiàn)由用戶輸入待查找數(shù)值。從根節(jié)點(diǎn)開(kāi)始比較,若較小則移至左子樹(shù),若較大則移至右子樹(shù),直至關(guān)鍵碼相等,則輸出節(jié)點(diǎn)情況。若用戶選擇插入,則現(xiàn)由用戶輸入待插入數(shù)值。從根節(jié)點(diǎn)開(kāi)始比較,若較小則移至左子樹(shù),若較大則移至右子樹(shù),直至到空節(jié)點(diǎn),則插入該元素。若用戶選擇刪除,則現(xiàn)由用戶輸入待刪除數(shù)值。從根節(jié)點(diǎn)開(kāi)始比較,若較小則移至左子樹(shù),若較大則移至右子樹(shù),直至關(guān)鍵碼相等;1).若該節(jié)點(diǎn)為葉子節(jié)點(diǎn),則直接刪除;2).若該節(jié)點(diǎn)無(wú)左子樹(shù),則其雙親節(jié)點(diǎn)直接與其右子樹(shù)根節(jié)點(diǎn)連接,再刪除該節(jié)點(diǎn);3).若該節(jié)點(diǎn)有左子樹(shù),則其左子樹(shù)的最右節(jié)點(diǎn)數(shù)值直接覆蓋該節(jié)點(diǎn)數(shù)值,再刪除最后節(jié)點(diǎn)。若用戶選擇銷(xiāo)毀,則不斷執(zhí)行刪除操作直至不剩余節(jié)點(diǎn)。若用戶選擇退出,則程序結(jié)束。2.3關(guān)鍵算法分析關(guān)鍵代碼即刪除操作,代碼如下:voidDelete(BiNode*&R){ BiNode*q=newBiNode; BiNode*s=newBiNode; if(R->lch==NULL){ q=R; R=R->rch; deleteq;} elseif(R->rch==NULL){ q=R; R=R->lch; deleteq; } else{ q=R; s=R->lch; while(s->rch!=NULL) { q=s; s=s->rch;}R->data=s->data; if(q!=R) q->rch=s->lch; else R->lch=s->lch; deletes;}}voidDeletedata(BiNode*&R,intkey){ if(R==NULL)return; if(R->data==key)Delete(R); elseif(R->data>key)Deletedata(R->lch,key); elseDeletedata(R->rch,key);}首先先要定位到要?jiǎng)h除的節(jié)點(diǎn),不斷遞歸調(diào)用deletedata這個(gè)函數(shù),找到數(shù)值與需要?jiǎng)h除節(jié)點(diǎn)的數(shù)值相等的節(jié)點(diǎn)時(shí),調(diào)用delete這個(gè)函數(shù)。刪除節(jié)點(diǎn)時(shí)需要分析三種情況。1).若該節(jié)點(diǎn)為葉子節(jié)點(diǎn),則直接刪除;2).若該節(jié)點(diǎn)無(wú)左子樹(shù),則其雙親節(jié)點(diǎn)直接與其右子樹(shù)根節(jié)點(diǎn)連接,再刪除該節(jié)點(diǎn);3).若該節(jié)點(diǎn)有左子樹(shù),則其左子樹(shù)的最右節(jié)點(diǎn)數(shù)值直接覆蓋該節(jié)點(diǎn)數(shù)值,再刪除最后節(jié)點(diǎn)。算法時(shí)間復(fù)雜度:O(n^2)2.4其他特殊情況處理:若文件里元素為空,不存在任何元素,則無(wú)法完成建樹(shù),選擇查找操作時(shí)也會(huì)提示無(wú)元素;另外,若查找不存在的元素是,最后查找到空節(jié)點(diǎn)也會(huì)提示無(wú)此元素。程序運(yùn)行結(jié)果分析總結(jié)4.1實(shí)驗(yàn)的難點(diǎn)和關(guān)鍵點(diǎn)本實(shí)驗(yàn)的難點(diǎn)和關(guān)鍵點(diǎn)主要在刪除元素上,為了保持二叉排序樹(shù)的有序性。刪除特定節(jié)點(diǎn)是要分三種情況討論1).若該節(jié)點(diǎn)為葉子節(jié)點(diǎn),則直接刪除;2).若該節(jié)點(diǎn)無(wú)左子樹(shù),則其雙親節(jié)點(diǎn)直接與其右子樹(shù)根節(jié)點(diǎn)連接,再刪除該節(jié)點(diǎn);3).若該節(jié)點(diǎn)有左子樹(shù),則其左子樹(shù)的最右節(jié)點(diǎn)數(shù)值直接覆蓋該節(jié)點(diǎn)數(shù)值,再刪除最后節(jié)點(diǎn)。4.2心得體會(huì)通過(guò)這次試驗(yàn)讓我進(jìn)一步對(duì)樹(shù)的應(yīng)用有了進(jìn)一步的了解,同時(shí)對(duì)查找這種基本數(shù)據(jù)操作有了較深刻的認(rèn)識(shí).同時(shí)在二叉排序樹(shù)的刪除操作的代碼編寫(xiě)時(shí),讓我明白了不同情況的不同處理方式。養(yǎng)成了更嚴(yán)謹(jǐn)?shù)木帉?xiě)代碼的思維方式。附:程序代碼#include<iostream>#include<fstream>usingnamespacestd;classBiNode{public: intdata; BiNode*lch; BiNode*rch;BiNode():lch(NULL),rch(NULL){};};BiNode*Search(BiNode*R,intkey){if(R==NULL){cout<<"無(wú)查詢結(jié)果"<<endl;returnNULL;}if(R->data==key)returnR;if(R->data<key)returnSearch(R->rch,key);if(R->data>key)returnSearch(R->lch,key);}voidInsert(BiNode*&R,BiNode*S){ if(R==NULL)R=S; if(R->data<S->data)Insert(R->rch,S); if(R->data>S->data)Insert(R->lch,S);}BiNode*Create(intdata[],intn){ BiNode*R=newBiNode; R=NULL; for(inti=0;i<n;i++){ BiNode*Q=newBiNode; Q->data=data[i]; Insert(R,Q); } returnR;}voidDelete(BiNode*&R){ BiNode*q=newBiNode; BiNode*s=newBiNode; if(R->lch==NULL){ q=R; R=R->rch; deleteq;} elseif(R->rch==NULL){ q=R; R=R->lch; deleteq; } else{ q=R; s=R->lch; while(s->rch!=NULL) { q=s; s=s->rch;}R->data=s->data; if(q!=R) q->rch=s->lch; else R->lch=s->lch; deletes;}}voidDeletedata(BiNode*&R,intkey){ if(R==NULL)return; if(R->data==key)Delete(R); elseif(R->data>key)Deletedata(R->lch,key); elseDeletedata(R->rch,key);}voidDeleteall(BiNode*&R,intdata[],intn){ for(inti=0;i<n;i++){ Deletedata(R,data[i]);} }voidmain(){ intdata[200]; BiNode*Root; Root=NULL; ifstreamifile("D://TEST//data.txt"); inti=0,n=0; cout<<"從文件讀入數(shù)據(jù)如下:"<<endl; while(ifile>>data[i]){ cout<<data[i]<<""; i++; n++; }Root=Create(data,n);while(1){cout<<"\n請(qǐng)輸入進(jìn)行的操作:\n1.查找\n2.插入\n3.刪除\n4.銷(xiāo)毀\n5.退出\n";intchoice;cin>>choice;while(choice!=1&&choice!=2&&choice!=3&&choice!=4&&choice!=5){ cout<<"無(wú)該選項(xiàng),請(qǐng)重新輸入"; cin>>choice;} switch(choice){ case1:{ cout<<"請(qǐng)輸入查找的數(shù)據(jù)"<<endl; intn; inti; cin>>n; BiNode*R; R=Search(Root,n); if(R->lch!=NULL){ cout<<"該數(shù)據(jù)節(jié)點(diǎn)左孩子數(shù)據(jù)為"<<R->lch->data<<endl; } if(R->rch!=NULL){ cout<<"該數(shù)據(jù)節(jié)點(diǎn)右孩子數(shù)據(jù)為"<<R->rch->data<<endl; } if(R->lch==NULL&&R->rch==NULL){ cout<<"該數(shù)據(jù)節(jié)點(diǎn)為葉子節(jié)點(diǎn)";} break; } case2:{ cout<<"請(qǐng)輸入插入數(shù)據(jù)"<<endl; intt; cin>>t; BiNode*w=newBiNode; w->data=t; Insert(Root,w); cout<<"插入成功"<<endl; cout<<"目前關(guān)鍵碼為:"; for(inti=0;i<n;i++){ cout<<data[i]<<"";} cout<<t<<""<<endl; break; } case3:{ intk; cout<<"請(qǐng)輸入刪除數(shù)據(jù)"<<endl; ints,judge=1; cin>>s; for(k=0;k<n;k++){ if(data[k]==s) break; } if(k==n){
溫馨提示
- 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ù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/ZHCA 004-2018化妝品影響皮膚表面酸堿度測(cè)試方法
- 健康管理師職業(yè)資格考試試卷及答案2025年
- 2025年消防安全知識(shí)考試試題及答案
- 2025年音樂(lè)學(xué)專(zhuān)業(yè)考試試題及答案
- 2025年數(shù)字媒體藝術(shù)創(chuàng)作能力測(cè)試卷及答案
- 2025年視覺(jué)藝術(shù)與傳播管理職業(yè)資格考試試題及答案
- 2025年公共責(zé)任與企業(yè)形象管理的考試試題及答案
- 2025年公共關(guān)系與傳播學(xué)考試試題及答案
- 2025年非營(yíng)利組織管理與運(yùn)營(yíng)知識(shí)測(cè)試卷及答案
- 2025年教育心理學(xué)專(zhuān)業(yè)研究生入學(xué)考試試卷及答案
- 浙江省金華市東陽(yáng)市2025年七年級(jí)下學(xué)期期末數(shù)學(xué)試題及答案
- 期末復(fù)習(xí)題(試題)2024-2025學(xué)年六年級(jí)下冊(cè)數(shù)學(xué)人教版
- 多彩的非洲文化 - 人教版課件
- 醫(yī)院檢驗(yàn)科實(shí)驗(yàn)室生物安全程序文件SOP
- 閥門(mén)系數(shù)Cv和KV值計(jì)算表格(帶公式)
- MSA測(cè)量系統(tǒng)分析軟件(第三版A級(jí)實(shí)例)
- 工業(yè)硅技術(shù)安全操作規(guī)程
- 消防工程項(xiàng)目樣板區(qū)、樣板間方案
- 導(dǎo)流明渠施工方案(共4頁(yè))
- 小學(xué)美術(shù)三年級(jí)下冊(cè)第5課我們班級(jí)的標(biāo)志PPT課件
- 兒童社會(huì)工作案例及分析PPT學(xué)習(xí)教案
評(píng)論
0/150
提交評(píng)論