版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、題目:二叉排序樹的建立、插入、刪除和查找 完成日期:2016-11-10一、需求分析1、 運(yùn)行環(huán)境:VC+6.0;語言:C語言;程序所實(shí)現(xiàn)的功能:給出一組關(guān)鍵值,建立相應(yīng)的二叉排序樹,完成:1結(jié)點(diǎn)的刪除操作,插入一個(gè)新結(jié)點(diǎn)的操作2對給定的值在二叉排序樹進(jìn)行查找;3隨時(shí)顯示操作的結(jié)果。2、 程序的輸入:n個(gè)關(guān)鍵字,及要插入,刪除,查找的關(guān)鍵字;3、 程序的輸出:操作后的二叉排序樹的中序序列即遞增序列;4、 測試數(shù)據(jù):1)8 12 5 10 6 11 13 9 (n=8);10;7;11; 2)10 7 12 9 8 (n=5);10;6;10; 3) 8 5 6 (n=3);6;9;8;二、概要
2、設(shè)計(jì) 1、程序的主要流程圖: 否是開始建樹: 依次輸入n個(gè)關(guān)鍵字 插入二叉排序樹中 中序輸出創(chuàng)建過程刪除任意結(jié)點(diǎn)插入一個(gè)結(jié)點(diǎn)查找關(guān)鍵字中序輸出操作后二叉排序樹是否繼續(xù)結(jié)束2、主要模塊: 1)主函數(shù)模塊 Main()建立n個(gè)關(guān)鍵字的二叉排序樹并輸出;從二叉樹排序樹T中刪除任意結(jié)點(diǎn),其關(guān)鍵字為x;在二叉樹排序樹T中,插入一個(gè)結(jié)點(diǎn)t,其關(guān)鍵字為key1;在二叉排序樹T中遞歸查找關(guān)鍵字等于 key2 的數(shù)據(jù)元素;查找成功則輸出SUCCESS;查找失敗則輸出NOSUCCESS;2)創(chuàng)建二叉排序樹模塊BiTree CreatBST(int n)建立n個(gè)關(guān)鍵字的二叉排序樹; 從鍵盤輸入調(diào)建立n個(gè)關(guān)鍵字依次用
3、InsertBST1(插入函數(shù)); 返回根結(jié)點(diǎn)T; 輸出過程; 3)刪除模塊DeleteNode(BiTree &T, int x)從二叉樹排序樹T中刪除任意結(jié)點(diǎn),其關(guān)鍵字為x; 可以實(shí)現(xiàn)刪除根結(jié)點(diǎn)、葉子結(jié)點(diǎn)以及其它任意結(jié)點(diǎn)的功能; 4)插入模塊void InsertBST1(BiTree &T,BiTNode *s)在二叉樹排序樹T中,插入一個(gè)結(jié)點(diǎn)s(遞歸算法); 被CreatBST函數(shù)調(diào)用; 5)查找模塊BiTree SearchBST1(BiTree T,TElemType key)在根指針T所指二叉排序樹中遞歸查找關(guān)鍵字等于 key 的數(shù)據(jù)元素; 若成功,返回指向該數(shù)據(jù)
4、元素結(jié)點(diǎn)的指針; 否則返回空指針;3、抽象數(shù)據(jù)類型設(shè)計(jì); 對于二叉樹排序樹而言,每個(gè)節(jié)點(diǎn)都是由“數(shù)據(jù)域”、左右 “指針域”三部分組成的,因此將二叉樹抽象成一個(gè)指向根結(jié)點(diǎn)由“關(guān)鍵字,左右孩子”構(gòu)成 的二叉鏈表。三、詳細(xì)設(shè)計(jì) 1、二叉排序樹數(shù)據(jù)類型定義;typedef struct BiTNode TElemType data;struct BiTNode *lchild,*rchild;/左右孩子指針 BiTNode,*BiTree; BiTree T;/ 二叉樹排序樹T 2、主要函數(shù)說明:(偽代碼及算法設(shè)計(jì)思想) void main()T=CreatBST(n); /建立n個(gè)關(guān)鍵字的二叉排序樹
5、,返回根結(jié)點(diǎn)T /從二叉樹排序樹T中刪除任意結(jié)點(diǎn),其關(guān)鍵字為xDeleteNode(T, x);Inorder(T); /在二叉樹排序樹T中,插入一個(gè)結(jié)點(diǎn)t,其關(guān)鍵字為key1t=(BiTree)malloc(sizeof(BiTNode);t->data=key1;t->lchild=NULL; t->rchild=NULL; InsertBST1(T,t);Inorder(T);/在二叉排序樹T中遞歸查找關(guān)鍵字等于 key2 的數(shù)據(jù)元素s=SearchBST1(T,key2);if(s)printf("SUCESSn");/查找成功else print
6、f("NOSUCESSn");/查找失敗BiTree SearchBST1(BiTree T, TElemType key)/在根指針T所指二叉排序樹中遞歸查找關(guān)鍵字等于 key 的數(shù)據(jù)元素 /若成功,返回指向該數(shù)據(jù)元素結(jié)點(diǎn)的指針,否則返回空指針;s為返回/指針if(T=NULL) return NULL; if(T->data=key) s=T;else if(T->data>key) /key大于當(dāng)前結(jié)點(diǎn)的關(guān)鍵字 ,則查找左子樹s=SearchBST1(T->lchild,key);/key小于當(dāng)前結(jié)點(diǎn)的關(guān)鍵字則查找右子樹 Else s=Sear
7、chBST1(T->rchild,key); return s;void Inorder(BiTree T)/中序輸出二叉樹排序樹T(非空時(shí))if(T!=NULL) Inorder(T->lchild);/中序輸出左子樹printf("%3d",T->data);/訪問結(jié)點(diǎn)Inorder(T->rchild);/中序輸出右子樹void InsertBST1(BiTree &T,BiTNode *s)/在二叉樹排序樹T中,插入一個(gè)結(jié)點(diǎn)s的遞歸算法t=SearchBST1(T,s->data);/若s的關(guān)鍵字不在T中出現(xiàn),則插入if(!t)
8、if(T=NULL)T=s; /空樹時(shí)作為根結(jié)點(diǎn) else if(s->data<T->data) InsertBST1(T->lchild,s); /將s插入T的左子樹else InsertBST1(T->rchild,s); /將s插入T的右子樹BiTree CreatBST(int n)/建立n個(gè)關(guān)鍵字的二叉排序樹, /從鍵盤輸入調(diào)建立n個(gè)關(guān)鍵字依次用InsertBST1(插入函數(shù)), /返回根結(jié)點(diǎn)TT=NULL; printf("建樹過程:n");for(i=1;i<=n;i+) printf("插入結(jié)點(diǎn)關(guān)鍵值:n&qu
9、ot;);scanf(key); s=(BiTree)malloc(sizeof(BiTNode);/開辟存儲(chǔ)單元,并對結(jié)點(diǎn)賦值s->data=key;s->lchild=NULL; s->rchild=NULL;InsertBST1(T,s); /調(diào)用插入算法 Inorder(T);/中序輸出return T;DeleteNode(BiTree &T, int x)/從二叉樹排序樹T中刪除任意結(jié)點(diǎn),其關(guān)鍵字為x p=T; /從根結(jié)點(diǎn)開始查找 pParent = NULL; / T的雙親為NULL / 開始查找關(guān)鍵字為x的結(jié)點(diǎn)p,及雙親pParent while (p
10、) if (x = p->data) break; pParent = p; p = x > p->data ? p->rchild : p->lchild; if (p=NULL) printf("要?jiǎng)h除的結(jié)點(diǎn)不存在n"); return false; / 至此已找到目標(biāo)結(jié)點(diǎn)p / pChileNode = p存在的孩子或NULL,左右都存在時(shí),取左 pChileNode = p->lchild!= NULL ? p->lchild : p->rchild; if(p->lchild=NULL|p->lchild
11、=NULL) /當(dāng)只存在1個(gè)孩子或2個(gè)孩子(葉子結(jié)點(diǎn))都為空時(shí),if (pParent = NULL) / 如果要?jiǎng)h除的是根,則把根設(shè)為找到的孩/或NULL T= pChileNode; else / 如果要?jiǎng)h除的不是根 /判斷一下要?jiǎng)h除的結(jié)點(diǎn)是其雙親的左還是右孩子做相應(yīng)處理 if(p=pParent->lchild) /刪除結(jié)點(diǎn),雙親相應(yīng)的指針指向這個(gè)結(jié)點(diǎn)的孩子 pParent->lchild= pChileNode; else pParent->rchild = pChileNode; /同上 free(p);/釋放空間 / 當(dāng)2個(gè)孩子都存在時(shí) else /pChileN
12、ode已指向p->lchildq=p; while (pChileNode->rchild) /在p的左字樹中查找中序p的前驅(qū)pChileNode,q為其雙親q=pChileNode; pChileNode = pChileNode->rchild; p->data=pChileNode->data;/p的前驅(qū)pChileNodede 的關(guān)鍵值賦給pif(q!=p) /將刪除p轉(zhuǎn)化為刪除pChileNodede(最多只有左字樹)結(jié)點(diǎn)q->rchild=pChileNode->lchild;/p的左字樹有右孩子else q->lchild=pChi
13、leNode->lchild;/p的左字樹有右孩子free(pChileNode); return true; 四、上級(jí)結(jié)果及體會(huì)1、實(shí)際完成情況:實(shí)現(xiàn)二叉排序樹的建立、插入、刪除和查找功能; 支持的數(shù)據(jù)類型:二叉鏈表。2、程序的性能分析:假設(shè)n個(gè)結(jié)點(diǎn)的二叉排序樹 創(chuàng)建:T(n)=O(n);刪除:T(n)=O(n);插入:T(n)=O(1) 查找:T(n)=O(logn);中序輸出:T(n)=O(n); 故程序:T(n)=O(n+logn)3、源程序,程序運(yùn)行時(shí)的初值和運(yùn)行結(jié)果(見附件)4、程序的擴(kuò)充和改進(jìn): 關(guān)鍵字類型可改為其他類型5、上機(jī)過程中出現(xiàn)的問題及其解決方案: 1)在編碼刪除結(jié)點(diǎn)DeleteNode函數(shù)的過程中遇到無法運(yùn)行的問題,經(jīng)請教老師,得到一定的提示:函數(shù)設(shè)計(jì)思路要理清; 2)在刪除根結(jié)點(diǎn)時(shí)出現(xiàn)不能執(zhí)行刪除結(jié)點(diǎn)左右子樹都存在的情況,魏近同學(xué)給出提示:結(jié)點(diǎn)轉(zhuǎn)換的思想; 6、收獲及體會(huì): 通過這次的課程設(shè)計(jì),我認(rèn)識(shí)到:僅僅掌握課本上的知識(shí)是不夠的,在實(shí)際操作時(shí),常常遇到一些問題,自己看不懂,更無法解決。不過,經(jīng)過自己不斷的思考,嘗試著去更改代碼中出現(xiàn)的問題。雖然開始很困難,但在老師和同學(xué)的幫助下,我逐漸的熟悉了許多操作,為后繼工作的順
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國包裝封口機(jī)械數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國CZZ新型驗(yàn)算碼防偽系統(tǒng)軟件數(shù)據(jù)監(jiān)測研究報(bào)告
- 二零二五年度超市租賃合同排他性節(jié)假日市場占有率提升協(xié)議
- 二零二五年度車庫抵押貸款及車位租賃管理協(xié)議
- 臨時(shí)工操作崗位勞動(dòng)協(xié)議范本2024年版一
- 二零二五年度輔導(dǎo)班食品安全與衛(wèi)生協(xié)議
- 二零二五年度銀行開戶后續(xù)金融數(shù)據(jù)分析與市場調(diào)研協(xié)議
- 2025版新舞蹈工作室舞蹈編導(dǎo)勞動(dòng)合同執(zhí)行協(xié)議3篇
- 二零二五年度出租車行業(yè)節(jié)能減排合作協(xié)議4篇
- 二零二五年度房產(chǎn)租賃合同糾紛解決協(xié)議
- 定額〔2025〕1號(hào)文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 2024年城市軌道交通設(shè)備維保及安全檢查合同3篇
- 電力溝施工組織設(shè)計(jì)-電纜溝
- 【教案】+同一直線上二力的合成(教學(xué)設(shè)計(jì))(人教版2024)八年級(jí)物理下冊
- 湖北省武漢市青山區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試卷(含解析)
- 單位往個(gè)人轉(zhuǎn)賬的合同(2篇)
- 電梯操作證及電梯維修人員資格(特種作業(yè))考試題及答案
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國式摔跤課程學(xué)生運(yùn)動(dòng)能力測評規(guī)范
- 鍋爐本體安裝單位工程驗(yàn)收表格
- 高危妊娠的評估和護(hù)理
評論
0/150
提交評論