




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGEPAGE1數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)說(shuō)明書(shū)
學(xué)院、系:軟件學(xué)院專(zhuān)業(yè)軟件工程設(shè)計(jì)題目:線索二叉樹(shù)的應(yīng)用需求分析既然題目要求要分別實(shí)現(xiàn)建立、刪除、和恢復(fù)線索化三種功能,建立和刪除一定是相互獨(dú)立的模塊,可分別建立兩個(gè)函數(shù)來(lái)實(shí)現(xiàn)功能。第三個(gè)功能是恢復(fù)線索,就要考慮這個(gè)線索恢復(fù)是怎樣的恢復(fù)過(guò)程,是怎樣恢復(fù)的?;謴?fù)線索是對(duì)二叉樹(shù)當(dāng)進(jìn)行了插入和刪除操作過(guò)程后,因?yàn)檫^(guò)程中有結(jié)點(diǎn)的變動(dòng),而進(jìn)行的在操作結(jié)束以后對(duì)整個(gè)二叉樹(shù)的恢復(fù)線索,還是在實(shí)現(xiàn)插入和刪除的過(guò)程中就對(duì)操作的結(jié)點(diǎn)實(shí)現(xiàn)局部的恢復(fù)線索。從設(shè)計(jì)的目標(biāo)來(lái)說(shuō)應(yīng)該是要在刪除和插入的過(guò)程中實(shí)現(xiàn)對(duì)線索的恢復(fù)。而在線索二叉樹(shù)中插入一個(gè)結(jié)點(diǎn)或刪除一個(gè)結(jié)點(diǎn),一般情況下,這些操作有可能破壞原來(lái)已有的線索,因此,在修改指針時(shí),還需要對(duì)線索做相應(yīng)的修改。概要設(shè)計(jì)首先建立二叉樹(shù),然后對(duì)二叉樹(shù)進(jìn)行線索化。線索鏈表的結(jié)點(diǎn)結(jié)構(gòu)
線索鏈表中的結(jié)點(diǎn)結(jié)構(gòu)為:………. 中序線索二叉樹(shù)詳細(xì)設(shè)計(jì)#include"stdio.h"#include"malloc.h"#definemaxsize20//規(guī)定樹(shù)中結(jié)點(diǎn)的最大數(shù)目typedefstructnode{//定義數(shù)據(jù)結(jié)構(gòu) intltag,rtag;//表示child域指示該結(jié)點(diǎn)是否孩子 chardata;//記錄結(jié)點(diǎn)的數(shù)據(jù) structnode*lchild,*rchild;//記錄左右孩子的指針}Bithptr;Bithptr*Q[maxsize];//建隊(duì),保存已輸入的結(jié)點(diǎn)的地址Bithptr*CreatTree(){//建樹(shù)函數(shù),返回根指針 charch; intfront,rear; Bithptr*T,*s; T=NULL; front=1;rear=0;//置空二叉樹(shù)printf("***********************************\n");printf("**\n");printf("*課程設(shè)計(jì)題目:線索二叉樹(shù)的運(yùn)算。*\n");printf("**\n");printf("***********************************\n"); printf("創(chuàng)建二叉樹(shù),請(qǐng)依次輸入,@表示虛結(jié)點(diǎn),以#結(jié)束\n"); ch=getchar();//輸入第一個(gè)字符 while(ch!='#')//判斷是否為結(jié)束字符 { s=NULL; if(ch!='@')//判斷是否為虛結(jié)點(diǎn) { s=(Bithptr*)malloc(sizeof(Bithptr)); s->data=ch; s->lchild=NULL; s->rchild=NULL; s->rtag=0; s->ltag=0; } rear++; Q[rear]=s;//將結(jié)點(diǎn)地址加入隊(duì)列中 if(rear==1)T=s;//輸入為第一個(gè)結(jié)點(diǎn)為根結(jié)點(diǎn) else { if(s!=NULL&&Q[front]!=NULL)//孩子和雙親結(jié)點(diǎn)均不是虛結(jié)點(diǎn) if(rear%2==0) Q[front]->lchild=s; elseQ[front]->rchild=s; if(rear%2==1)front++; } ch=getchar(); } returnT;}voidInorder(Bithptr*T)//中序遍歷{ if(T) { if(T->ltag!=1)Inorder(T->lchild); printf("→%c",T->data); if(T->rtag!=1)Inorder(T->rchild); }}Bithptr*pre=NULL;voidPreThread(Bithptr*root)//中序線索化算法,函數(shù)實(shí)現(xiàn){ Bithptr*p; p=root;if(p){ PreThread(p->lchild);//線索化左子樹(shù) if(pre&&pre->rtag==1)pre->rchild=p;//前驅(qū)結(jié)點(diǎn)后繼線索化if(p->lchild==NULL) { p->ltag=1; p->lchild=pre; } if(p->rchild==NULL)//后繼結(jié)點(diǎn)前驅(qū)線索化 p->rtag=1; pre=p; PreThread(p->rchild); }}voidPrintIndex(Bithptr*t)//輸出線索{ Bithptr*f; f=t; if(f) { if(f->ltag==1&&f->lchild==NULL&&f->rtag==1)printf("【%c】",f->data);//如果是第一個(gè)結(jié)點(diǎn) if(f->ltag==1&&f->lchild!=NULL)printf("%c→【%c】",f->lchild->data,f->data);//如果此結(jié)點(diǎn)有前驅(qū)就輸出前驅(qū)和此結(jié)點(diǎn) if(f->ltag==1&&f->rtag==1&&f->rchild!=NULL)printf("→%c",f->rchild->data);//如果此結(jié)點(diǎn)有前驅(qū)也有后繼,就輸出后繼 elseif(f->rtag==1&&f->rchild!=NULL)printf("【%c】→%c",f->data,f->rchild->data);//如果沒(méi)有前驅(qū),就輸出此結(jié)點(diǎn)和后繼 printf("\n"); if(f->ltag!=1)PrintIndex(f->lchild); if(f->rtag!=1)PrintIndex(f->rchild); }} Bithptr*SearchChild(Bithptr*point,charfindnode)//查找孩子結(jié)點(diǎn)函數(shù){Bithptr*point1,*point2;if(point!=NULL){if(point->data==findnode)returnpoint;else if(point->ltag!=1){point1=SearchChild(point->lchild,findnode);if(point1!=NULL)returnpoint1;}if(point->rtag!=1){point2=SearchChild(point->rchild,findnode);if(point2!=NULL)returnpoint2;}returnNULL; }elsereturnNULL;}Bithptr*SearchPre(Bithptr*point,Bithptr*child)//查找父親結(jié)點(diǎn)函數(shù){Bithptr*point1,*point2;if(point!=NULL){if((point->ltag!=1&&point->lchild==child)||(point->rtag!=1&&point->rchild==child))returnpoint;//找到則返回else if(point->ltag!=1) { point1=SearchPre(point->lchild,child); if(point1!=NULL) returnpoint1; }if(point->rtag!=1) { point2=SearchPre(point->rchild,child); if(point2!=NULL) returnpoint2; }returnNULL; }elsereturnNULL;}voidInsert(Bithptr*root){ charch; charc; Bithptr*p1,*child,*p2; printf("請(qǐng)輸入要插入的結(jié)點(diǎn)的信息:");scanf("%c",&c); scanf("%c",&c);p1=(Bithptr*)malloc(sizeof(Bithptr));//插入的結(jié)點(diǎn)信息 p1->data=c; p1->lchild=NULL; p1->rchild=NULL; p1->rtag=0; p1->ltag=0; printf("輸入查找的結(jié)點(diǎn)信息:");scanf("%c",&ch); scanf("%c",&ch); child=SearchChild(root,ch);//查孩子結(jié)點(diǎn)的地址 if(child==NULL){ printf("沒(méi)有找到結(jié)點(diǎn)\n"); system("pause"); return; } elseprintf("發(fā)現(xiàn)結(jié)點(diǎn)%c\n",child->data); if(child->ltag==0)//當(dāng)孩子結(jié)點(diǎn)有左孩子的時(shí)候 { p2=child; child=child->lchild; while(child->rchild&&child->rtag==0)//找到左子樹(shù)下,最右結(jié)點(diǎn) child=child->rchild; p1->rchild=child->rchild;//后繼化 p1->rtag=1; child->rtag=0; child->rchild=p1;//連接 p1->lchild=child;//前驅(qū)化 p1->ltag=1; } else//當(dāng)孩子結(jié)點(diǎn)沒(méi)有左孩子的時(shí)候 { p1->lchild=child->lchild;//前驅(qū)化 child->ltag=0; p1->ltag=1; child->lchild=p1; p1->rchild=child; p1->rtag=1; } printf("\n\t插入結(jié)點(diǎn)操作已經(jīng)完成,并同時(shí)完成了線索化的恢復(fù)\n");}Bithptr*DeleteNode(Bithptr*t){ Bithptr*child,*pre,*s,*q; charch; printf("輸入查找的結(jié)點(diǎn)信息:");ch=getchar(); ch=getchar(); child=SearchChild(t,ch);//查找該結(jié)點(diǎn)的孩子結(jié)點(diǎn) printf("發(fā)現(xiàn)結(jié)點(diǎn):%c\n",child->data); printf("ltag=%d,rtag=%d\n",child->ltag,child->rtag); if(NULL==child) { printf("沒(méi)有找到結(jié)點(diǎn):"); returnt; } if(child!=t) { pre=SearchPre(t,child); printf("發(fā)現(xiàn)結(jié)點(diǎn):%c\n",pre->data); } else//當(dāng)是頭結(jié)點(diǎn)的時(shí)候 if(child->ltag==1&&child->rtag==1)//沒(méi)有左右孩子 t=NULL; elseif(t->ltag==1&&t->rtag!=1)//有右孩子沒(méi)有左孩子 { t=child->rchild; child->rchild->lchild=NULL; free(child); returnt; }else if(t->ltag!=1&&t->rtag==1)//有左孩子沒(méi)有右孩子 { t=child->lchild; child->lchild->rchild=NULL; free(child); returnt; }else if(t->ltag!=1&&t->rtag!=1)//有左孩子也有右孩子 { t=child->lchild; s=child->lchild; while(s->rchild&&s->rtag!=1)//查找孩子左子樹(shù)的最右下結(jié)點(diǎn) s=s->rchild; q=child->rchild; while(q->lchild&&q->ltag!=1)//查找孩子右子樹(shù)的最左下結(jié)點(diǎn) q=q->lchild; s->rchild=child->rchild;//連接 s->rtag=0; q->lchild=s; free(child); returnt; } if(child==pre->lchild||child==pre)//是父親結(jié)點(diǎn)的左孩子 { if(1==child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)無(wú)左右 { pre->lchild=child->lchild; pre->ltag=1; if(child->lchild!=NULL) if(child->lchild->rtag==1)child->lchild->rchild=pre; free(child); } elseif(1!=child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)有左無(wú)右 { pre->lchild=child->lchild; s=child->lchild; while(s->rchild)//查找左子樹(shù)的最右下結(jié)點(diǎn) s=s->rchild; s->rchild=child->rchild; free(child); } elseif(1==child->ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)有右無(wú)左 { pre->lchild=child->rchild; s=child->rchild; while(s->lchild) s=s->lchild; s->lchild=child->lchild; if(child->lchild!=NULL) if(child->lchild->rtag==1)child->lchild->rchild=pre; free(child); } elseif(1!=child->ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)左右都有 { pre->lchild=child->lchild; s=child->rchild; while(s->lchild&&s->ltag!=1)//找到右子樹(shù)的最左下結(jié)點(diǎn) s=s->lchild; q=child->lchild; while(q->rchild&&q->rtag!=1)//找到左子樹(shù)下最右下結(jié)點(diǎn) q=q->rchild; q->rchild=child->rchild;//將孩子結(jié)點(diǎn)的右子樹(shù)接到左子樹(shù)下最右下結(jié)點(diǎn) q->rtag=0; s->lchild=q; free(child); } }else{if(child==pre->rchild)//是父親結(jié)點(diǎn)的右孩子 { if(1==child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)無(wú)左右 { pre->rchild=child->rchild; pre->rtag=1; if(child->rchild!=NULL) if(child->rchild->ltag==1)child->rchild->lchild=pre; free(child); } elseif(1!=child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)有左無(wú)右 { pre->rchild=child->lchild; s=child->lchild; while(s->rchild) s=s->rchild; s->rchild=child->rchild; if(child->rchild!=NULL) if(child->rchild->ltag==1)child->rchild->lchild=pre; free(child); } elseif(1==child->ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)有右無(wú)左 { pre->rchild=child->rchild; s=child->rchild; while(s->lchild) s=s->lchild; s->lchild=child->lchild; free(child); } elseif(1!=child->ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)左右都有 { pre->rchild=child->rchild; s=child->rchild; while(s->lchild&&s->ltag!=1)//找到右子樹(shù)的最左下結(jié)點(diǎn) s=s->lchild; q=child->lchild; while(q->rchild&&q->rtag!=1)//找到左子樹(shù)下最右下結(jié)點(diǎn) q
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨時(shí)勞工合同范本
- 與企業(yè)有關(guān)合同范本文檔
- 書(shū)籍委托銷(xiāo)售合同范本
- 2024年溫州市自來(lái)水有限公司招聘考試真題
- 2024年天津市中西醫(yī)結(jié)合醫(yī)院(天津市南開(kāi)醫(yī)院)招聘考試真題
- 加油站公司合同范本
- 2024年廈門(mén)市集美區(qū)杏?xùn)|中學(xué)教師招聘考試真題
- 2024年溫州文成農(nóng)商銀行招聘筆試真題
- 鳳崗酒店蔬菜配送合同范本
- 2024年六安霍邱聯(lián)合村鎮(zhèn)銀行招聘考試真題
- 短視頻居間代理合同范本
- 二零二五年度港口碼頭安全承包服務(wù)協(xié)議4篇
- 2024年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 《歡樂(lè)運(yùn)動(dòng)會(huì):1 我為班級(jí)出把力》說(shuō)課稿-2024-2025學(xué)年四年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)滬科黔科版
- 2024年汽車(chē)駕駛員(高級(jí))證考試題庫(kù)附答案
- 2025年中智集團(tuán)及下屬單位招聘筆試參考題庫(kù)含答案解析
- 廣東2025年高中化學(xué)學(xué)業(yè)水平考試模擬試卷試題(含答案詳解)
- 2024年中國(guó)牛排2市場(chǎng)調(diào)查研究報(bào)告
- 2025年事業(yè)單位考試(綜合管理類(lèi)A類(lèi))綜合應(yīng)用能力試題及解答參考
- 科創(chuàng)板知識(shí)題庫(kù)試題及答案
- UL1450標(biāo)準(zhǔn)中文版-2019電動(dòng)空氣壓縮機(jī)真空泵和涂裝設(shè)備中文版第四版
評(píng)論
0/150
提交評(píng)論