下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱: 二叉排序樹(shù) 學(xué)生: 班 級(jí): 班序號(hào): 學(xué) 號(hào): 日 期: 1. 實(shí)驗(yàn)要求根據(jù)二叉排序樹(shù)的抽象數(shù)據(jù)類型的定義,使用二叉鏈表實(shí)現(xiàn)一個(gè)二叉排序樹(shù)。 二叉排序樹(shù)的基本功能:1. 二叉排序樹(shù)的建立2二叉排序樹(shù)的查找3二叉排序樹(shù)的插入4二叉排序樹(shù)的刪除5二叉排序樹(shù)的銷毀6其他:自定義操作編寫(xiě)測(cè)試main()函數(shù)測(cè)試二叉排序樹(shù)的正確性2. 程序分析2.1存儲(chǔ)結(jié)構(gòu)二叉鏈表Data Lchild Rchild般為流程圖等)2.2程序流程(或程序結(jié)構(gòu)、或類關(guān)系圖等表明程序構(gòu)成的容,221.流程圖開(kāi)始從文件讀取原始數(shù)據(jù)建立排序二叉樹(shù)當(dāng)前根節(jié)點(diǎn)是否存在判斷下一個(gè)元素否該元素節(jié)點(diǎn)插入到當(dāng)
2、前根節(jié)點(diǎn)位置用戶輸入操作判斷操作否A/ / 執(zhí)行查找操作直到為 空節(jié)點(diǎn)執(zhí)行查找操作該元素和當(dāng)前根節(jié)點(diǎn)耳r數(shù)據(jù)比在該位置插入其節(jié)點(diǎn)刪除最終節(jié)點(diǎn)較大小刪除該節(jié)點(diǎn)是否銷毀完結(jié)束小刪除下一節(jié)點(diǎn)根節(jié)點(diǎn)移向根節(jié)點(diǎn)移向右孩子左孩子是否銷毀完當(dāng)前根節(jié) 點(diǎn)值是否 相等是輸出該節(jié)點(diǎn)情況偽代碼1.從文件讀取待建樹(shù)元素2. 建樹(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)則插入該元素, 不斷 插入直至不剩下元素。3. 用戶選擇操作。4. 若用戶選擇查找, 則現(xiàn)由用戶輸入待查找數(shù)值。 從根節(jié)點(diǎn)開(kāi)始比較, 若較小則移至左子樹(shù)
3、, 若較大則移至右子樹(shù),直至關(guān)鍵碼相等,則輸出節(jié)點(diǎn)情況。5. 若用戶選擇插入, 則現(xiàn)由用戶輸入待插入數(shù)值。 從根節(jié)點(diǎn)開(kāi)始比較, 若較小則移至左子樹(shù), 若較大則移至右子樹(shù),直至到空節(jié)點(diǎn),則插入該元素。6. 若用戶選擇刪除, 則現(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)。7. 若用戶選擇銷毀,則不斷執(zhí)行刪除操作直至不剩余節(jié)點(diǎn)。8. 若用
4、戶選擇退出,則程序結(jié)束。2.3 關(guān)鍵算法分析關(guān)鍵代碼即刪除操作,代碼如下:void Delete(BiNode* &R)BiNode* q=new BiNode;BiNode *s=new BiNode; if(R->lch=NULL) q=R;R=R->rch;delete q;else if(R->rch=NULL)q=R;R=R->lch;delete q;elseq=R;s=R->lch;while(s->rch!=NULL)q=s;s=s->rch;R->data=s->data;if(q!=R)q->rch=s-&
5、gt;lch;elseR->lch=s->lch; delete s;void Deletedata(BiNode* &R, int key) if(R=NULL) return; if(R->data=key) Delete(R);else if(R->data>key) Deletedata(R->lch,key); else Deletedata(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í)需要分析三種
6、情況。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ù)雜度: 0( n2)2.4 其他 特殊情況處理:若文件里元素為空,不存在任何元素,則無(wú)法完成建樹(shù),選擇查找操作時(shí)也 會(huì)提示無(wú)元素;另外,若查找不存在的元素是,最后查找到空節(jié)點(diǎn)也會(huì)提示無(wú)此元素。3. 程序運(yùn)行結(jié)果分析4. 總結(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),則直
7、接刪除;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> using namespace std; class BiNode public: int data
8、; BiNode* lch; BiNode* rch; BiNode():lch(NULL),rch(NULL);BiNode* Search(BiNode* R,int key) if(R=NULL) cout<<" 無(wú)查詢結(jié)果 "<<endl;return NULL; if(R->data=key) return R;if(R->data<key) return Search(R->rch,key);if(R->data>key) return Search(R->lch,key);void Insert
9、(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(int data,int n)BiNode* R=new BiNode;R=NULL; for(int i=0;i<n;i+)BiNode* Q=new BiNode;Q->data=datai;Insert(R,Q);return R;void Delete(BiNode*
10、 &R)BiNode* q=new BiNode;BiNode *s=new BiNode;if(R->lch=NULL)q=R;R=R->rch;delete q;else if(R->rch=NULL) q=R; R=R->lch; delete q;elseq=R;s=R->lch;while(s->rch!=NULL)q=s; s=s->rch; R->data=s->data;if(q!=R) q->rch=s->lch;elseR->lch=s->lch;delete s;void Deleted
11、ata(BiNode* &R, int key)if(R=NULL) return;if(R->data=key) Delete(R);else if(R->data>key) Deletedata(R->lch,key);else Deletedata(R->rch,key);void Deleteall(BiNode* &R,int data,int n) for(int i=0;i<n;i+) Deletedata(R,datai);void main()int data200;BiNode *Root;Root=NULL;ifstre
12、am ifile("D:/TEST/data.txt");int i=0,n=0;cout<<" 從文件讀入數(shù)據(jù)如下: "<<endl;while(ifile>>datai)cout<<datai<<" "i+;n+;Root=Create(data,n);while(1)cout<<"n請(qǐng)輸入進(jìn)行的操作:n1.查找n2.插入n3.刪除n4.銷毀n5.退出n" int choice;cin>>choice; while(choice
13、!=1&&choice!=2&&choice!=3&&choice!=4&&choice!=5) cout<<" 無(wú)該選項(xiàng),請(qǐng)重新輸入 "cin>>choice;switch(choice)case 1:cout<<" 請(qǐng)輸入查找的數(shù)據(jù) "<<endl;int n;int i;cin>>n;BiNode* R;R=Search(Root,n); if(R->lch!=NULL)cout<<" 該數(shù)據(jù)節(jié)點(diǎn)左
14、孩子數(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;case 2:cout<<" 請(qǐng)輸入插入數(shù)據(jù) "<<endl;int t;cin>&
15、gt;t;BiNode* w=new BiNode; w->data=t;Insert(Root,w); cout<<" 插入成功 "<<endl; cout<<" 目前關(guān)鍵碼為: "for(int i=0;i<n;i+) cout<<datai<<" " cout<<t<<" "<<endl;break;case 3:int k;cout<<" 請(qǐng)輸入刪除數(shù)據(jù) "<<endl;int s,judge=1;cin>>s;for(k=0;k<n;k+) if(datak=s) break;if(k=n)cout<<" 該數(shù)據(jù)不存在 "<<endl; e
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工反壟斷合同范本
- 農(nóng)藥生產(chǎn)架電施工合同
- 涂料施工銷售渠道合同
- 林業(yè)開(kāi)發(fā)供貨施工合同范本
- 餐飲與企業(yè)合同范例
- 飯店公司合伙合同范例
- 公路工程項(xiàng)目合同進(jìn)度檢查內(nèi)容表格
- 集體合同約定的最低工資和當(dāng)?shù)刈畹凸べY標(biāo)準(zhǔn)
- 門(mén)診醫(yī)療器械銷售合同范例
- 贈(zèng)與合同范例15篇
- (完整word版)首件檢驗(yàn)管理制度
- 線路工程灌注樁施工作業(yè)指導(dǎo)書(shū)施工方案
- 重力壩的分縫與止水
- 三重管高壓旋噴樁施工工藝規(guī)程與施工方案
- 個(gè)體診所藥品清單
- PFMEA的嚴(yán)重度SOD的評(píng)分和優(yōu)先級(jí)別
- 國(guó)網(wǎng)基建國(guó)家電網(wǎng)公司輸變電工程結(jié)算管理辦法
- 100道遞等式計(jì)算(能巧算得要巧算)
- 中國(guó)地圖含省份信息可編輯矢量圖
- 路政運(yùn)政交通運(yùn)輸執(zhí)法人員考試題庫(kù)
- 企業(yè)技術(shù)標(biāo)準(zhǔn)化管理
評(píng)論
0/150
提交評(píng)論