數(shù)據(jù)結(jié)構(gòu)-二叉樹的建_第1頁
數(shù)據(jù)結(jié)構(gòu)-二叉樹的建_第2頁
數(shù)據(jù)結(jié)構(gòu)-二叉樹的建_第3頁
數(shù)據(jù)結(jié)構(gòu)-二叉樹的建_第4頁
數(shù)據(jù)結(jié)構(gòu)-二叉樹的建_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)結(jié)構(gòu)-二叉樹的建立與遍歷《數(shù)據(jù)結(jié)構(gòu)》實(shí)驗(yàn)報(bào)告◎?qū)嶒?yàn)題目:二叉樹的建立與遍歷◎?qū)嶒?yàn)?zāi)康模?、掌握使用VisualC++6.0上機(jī)調(diào)試程序的基本方法;iwJ2、 掌握二叉樹的存儲(chǔ)結(jié)構(gòu)和非遞歸遍歷操作的實(shí)現(xiàn)方法。iwJ3、 提高自己分析問題和解決問題的能力,在實(shí)踐中理解教材上的理論?!?qū)嶒?yàn)內(nèi)容:利用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)建立二叉樹,然后先序輸出該二叉樹的結(jié)點(diǎn)序列,在在本實(shí)驗(yàn)中不使用遞歸的方法,而是用一個(gè)棧存儲(chǔ)結(jié)點(diǎn)的指針,以此完成實(shí)驗(yàn)要求。一、需求分析1、 輸入的形式和輸入值的范圍:根據(jù)提示,輸入二叉樹的括號(hào)表示形式,按回車結(jié)束。2、 輸出的形式:輸出結(jié)果為先序遍歷二叉樹所得到的結(jié)點(diǎn)序列。3、 程序所能達(dá)到的功能:輸入二叉樹后,該程序可以建立二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),之后按照一定的順序訪問結(jié)點(diǎn)并輸出相應(yīng)的值,從而完成二叉樹的先序遍歷。4、 測(cè)試數(shù)據(jù):

輸入二叉樹的括號(hào)表示形式:A(B(D(,G)),C(E,F))iwJ先序遍歷結(jié)果為:ABDGCEFiwJ是否繼續(xù)?(是,輸入1;否,輸入0):1輸入二叉樹的括號(hào)表示形式:二叉樹未建立是否繼續(xù)?(是,輸入1;否,輸入0):0Pressanykeytocontinue二概要設(shè)計(jì)1、二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)是用一個(gè)鏈表來存儲(chǔ)一棵二叉樹,二叉樹中每一個(gè)結(jié)點(diǎn)用鏈表中的一個(gè)鏈結(jié)點(diǎn)來存儲(chǔ)。每個(gè)結(jié)點(diǎn)的形式如下圖所示。IchilddataIchilddatarchild其中data表示值域,用于存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù)元素,lchild和rchild分別表示左指針域和右指針域,用于分別存儲(chǔ)左孩子結(jié)點(diǎn)和右孩子結(jié)點(diǎn)的存儲(chǔ)位置。2、二叉樹的建立本程序中利用數(shù)組存儲(chǔ)所輸入的二叉樹,然后從頭到尾掃描數(shù)組中的每一個(gè)字符根據(jù)字符的不同分別執(zhí)行不同的操作,并用一個(gè)存儲(chǔ)結(jié)點(diǎn)指針的棧輔助完成。在掃描前先申請(qǐng)一個(gè)結(jié)點(diǎn)作為根結(jié)點(diǎn),也是當(dāng)前指針?biāo)附Y(jié)點(diǎn),在二叉樹的建立的過程中,每次申請(qǐng)一個(gè)新結(jié)點(diǎn),需對(duì)其進(jìn)行初始化,即令I(lǐng)child域和rchild域?yàn)榭?。按照本程序的思路,二叉樹A(B(D(,G)),C(E,F(xiàn)))的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)如下圖所示。二叉樹建立的具體過程見詳細(xì)設(shè)計(jì)部分。liiiJ3、二叉樹的先序遍歷liiiJlii-J在二叉樹的先序遍歷過程中也需利用一個(gè)存儲(chǔ)結(jié)點(diǎn)指針的棧輔助完成,初始時(shí)棧為空,二叉樹遍歷結(jié)束后棧也為空,所以在開始時(shí)將頭結(jié)點(diǎn)入棧,之后根據(jù)當(dāng)前指針?biāo)附Y(jié)點(diǎn)的特性的不同執(zhí)行不同的操作,以??兆鳛槎鏄浔闅v的結(jié)束條件。二叉樹先序遍歷的具體過程見詳細(xì)設(shè)計(jì)部分。

lii-JA(B(DG));C(E;F))4、本程序的基本操作和模塊:建立二叉樹的函數(shù):voidCreate(BiTNode*B,SeqStack&K,chars[])遍歷二叉樹的函數(shù):voidPreorder(BiTNode*B,SeqStack&K)主函數(shù):main()函數(shù)的調(diào)用關(guān)系如下圖所示:三詳細(xì)設(shè)計(jì)(一)元素類型、結(jié)點(diǎn)類型1、二叉樹結(jié)點(diǎn)的類型描述typedefstructnode /*二叉樹結(jié)點(diǎn)的類型描述*/{chardata;/*data用于存儲(chǔ)二叉樹中的字母*/structnode*lchild;/*lchild為指向該結(jié)點(diǎn)左孩子的指針*/

structnode*rchild;/*rchild為指向該結(jié)點(diǎn)下一層的指針*/}BiTNode;/*順序棧的類型2、順序棧的類型描述/*順序棧的類型typedefstruct描述*/{/*指針數(shù)組,用BiTNode*pin[40];/*指針數(shù)組,用于存儲(chǔ)廣義表結(jié)點(diǎn)指針*/inttop; /*棧頂指針*/}SeqStack;(二)每個(gè)模塊的分析1、主程序模塊main。{定義數(shù)組,存儲(chǔ)輸入的字符串定義并申請(qǐng)根結(jié)點(diǎn)初始化順序棧while(1){調(diào)用建立二叉樹的函數(shù),建立二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)iwJ調(diào)用遍歷二叉樹的函數(shù),輸出所建立的二叉樹的結(jié)點(diǎn)iwJ選擇是否繼續(xù),若是,則重新執(zhí)行循環(huán)中的操作;若否,則退出循環(huán)}}2、建立二叉樹的函數(shù)voidCreate(BiTNode*B,SeqStack&K,chars[]){定義表示當(dāng)前結(jié)點(diǎn)的指針p,和表示新申請(qǐng)結(jié)點(diǎn)的指針q令p指向根結(jié)點(diǎn),根結(jié)點(diǎn)的lchild域和rchild域?yàn)榭铡]斎攵鏄鋸念^到尾掃描輸入的字符,進(jìn)入以下循環(huán),當(dāng)遇到空字符時(shí)結(jié)束循環(huán)for(j=0;s[j]!='\0';j++){◎若字符為'(',執(zhí)行以下操作

若'('的下一個(gè)字符為',',當(dāng)前結(jié)點(diǎn)p的Ichild域?yàn)榭杖?('的下一個(gè)字符不為','則執(zhí)行以下的操作:{申請(qǐng)新結(jié)點(diǎn)q,并令新結(jié)點(diǎn)q的Ichild域和rchild域?yàn)榭樟町?dāng)前結(jié)點(diǎn)p的Ichild域指向新申請(qǐng)的結(jié)點(diǎn)q請(qǐng)的結(jié)點(diǎn)q將新申請(qǐng)的結(jié)點(diǎn)q作為新的當(dāng)前結(jié)?=i點(diǎn)p}}◎若字符為',',執(zhí)行以下操作{令當(dāng)前結(jié)點(diǎn)p為棧頂元素,但不退棧申請(qǐng)新結(jié)點(diǎn)q,并令新結(jié)點(diǎn)q的lchild域和rchild域?yàn)榭樟町?dāng)前結(jié)點(diǎn)p的rchild域指向新申請(qǐng)的結(jié)點(diǎn)q將新申請(qǐng)的結(jié)點(diǎn)q作為新的當(dāng)前結(jié)點(diǎn)p}◎若字符為')',執(zhí)行以下操作(出棧,令當(dāng)前結(jié)點(diǎn)p為棧頂元素}◎若字符為字母,執(zhí)行以下操作{令當(dāng)前結(jié)點(diǎn)p的data域?yàn)樵撟帜溉粼撟帜傅南乱粋€(gè)字符為’('則令當(dāng)前結(jié)點(diǎn)指針p進(jìn)棧}}}3、遍歷二叉樹的函數(shù)voidDisplay(GLNode*G,SeqStack&K){定義表示當(dāng)前結(jié)點(diǎn)的指針p,并令p指根結(jié)點(diǎn)。指向根結(jié)點(diǎn)的指針p入棧,使棧不空'。當(dāng)棧不空時(shí)執(zhí)行以下操作while(K.top!=-1){出棧,棧頂元素所指的結(jié)點(diǎn)作為當(dāng)前結(jié)點(diǎn)p,輸出當(dāng)前結(jié)點(diǎn)p中的字母若當(dāng)前結(jié)點(diǎn)p的右孩子不為空,則令當(dāng)前結(jié)點(diǎn)p的右孩子進(jìn)棧若當(dāng)前結(jié)點(diǎn)p的左孩子不為空,則令當(dāng)前結(jié)點(diǎn)p的左孩子進(jìn)棧}}四使用說明、測(cè)試分析及結(jié)果1、 程序使用說明:本程序運(yùn)行環(huán)境為VisualC++6.0;根據(jù)界面提示進(jìn)行操作,注意輸入的字符為西文字符2、 測(cè)試結(jié)果與分析:頁面提示“輸入二叉樹的括號(hào)表示形式:”輸入“A(B(D(,G)),C(E,F))”,按回車確定,頁面顯示如下:ilijJ“先序遍歷結(jié)果為:ABDGCEFilijJ是否繼續(xù)?(是,輸入1;否,輸入0):”

輸入序號(hào)“1”,按回車確定,表示繼續(xù)操作。頁面提示“輸入二叉樹的括號(hào)表示形式:”不輸入二叉樹,直接按回車確定,則頁面顯示如下:“二叉樹未建立是否繼續(xù)?(是,輸入1;否,輸入0):”輸入序號(hào)“0”,按回車確定,表示結(jié)束操作,頁面顯示如下:“Pressanykeytocontinue”由上測(cè)試結(jié)果分析得,該程序功能滿足題目要求。3、 調(diào)試過程中遇到的問題及解決方法l=J

w當(dāng)代碼編寫完成后,編譯過程出現(xiàn)了很多小錯(cuò)誤,比如語句末尾漏掉分號(hào),使用了某些變量卻未定義,但這些問題很快發(fā)現(xiàn)并及時(shí)糾正。l=J

w總的來說,因?yàn)楸敬螌?shí)驗(yàn)和廣義表的建立和輸出有相似之處,所以避免了很多問題,比較順利。4、 運(yùn)行界面礦"Di^wo^C'iDebugXworkA.exe"BA—XHS5括號(hào)表示形"序遍歷結(jié)果為:朋DQCEF尊繼續(xù)了(是-輸入1;否?輸加)=1入二只樹的括號(hào)表示形式,卜又相未建亶基繼續(xù)?(是-輸入否,輸如)=ePressanykeytocontinue五、實(shí)驗(yàn)總結(jié)本次實(shí)驗(yàn)提前作了預(yù)習(xí),在編寫程序上花費(fèi)的時(shí)間不算太多,我在11月1日下午完成代碼的編寫并修改正確。因?yàn)楸敬螌?shí)驗(yàn)和廣義表的建立和輸出有相似之處,所以大的問題基本沒有出現(xiàn),一些小的問題也及時(shí)發(fā)現(xiàn)并糾正。本次實(shí)驗(yàn),我很感謝老師和同學(xué)對(duì)我的指點(diǎn)。通過本次實(shí)驗(yàn),對(duì)二叉樹的存儲(chǔ)結(jié)構(gòu)有了更深的認(rèn)識(shí),對(duì)一些細(xì)節(jié)更加理解,收獲了很多。教師評(píng)語:實(shí)驗(yàn)成績(jī):指導(dǎo)教師簽名:批閱日期:代碼:#include<stdio.h>// typedefstructnode{chardata;structnode*lchild;structnode*rchild;}BiTNode;//〃二叉樹結(jié)點(diǎn)的類型描述//data用于存儲(chǔ)二叉樹中的字母//lchild為指向該結(jié)點(diǎn)左孩子的指針//rchild為指向該結(jié)點(diǎn)下一層的指針typedefstruct{BiTNode*pin[40];inttop;}SeqStack;// 〃順序棧的類型描述〃指針數(shù)組,用于存儲(chǔ)廣義表結(jié)點(diǎn)指針〃棧項(xiàng)指針#include<stdlib.h>voidCreate(BiTNode*B,SeqStack&K,chars[])//建立二叉樹的函數(shù)BiTNode*p,*q;intj;printfC輸入二叉樹的括號(hào)表示形式:");//p指針指向當(dāng)前結(jié)點(diǎn),q指針指向新申請(qǐng)的結(jié)點(diǎn)//j用于標(biāo)記輸入的字符在數(shù)組中的位置〃提示輸入二叉樹gets(s);P=B;〃當(dāng)前結(jié)點(diǎn)為根結(jié)點(diǎn)p->lchild=NULL;p->rchild=NULL;〃根結(jié)點(diǎn)的lchild域和rchild域?yàn)榭說or(j=0;s[j]!='\0';j++)〃進(jìn)入循環(huán),建立二叉樹if(s[j]=='(')〃若字符為'(',執(zhí)行以下操作if(s[j+1]==',')//若'('的下一個(gè)字符為',',當(dāng)前結(jié)點(diǎn)p的lchild域?yàn)榭誩lsep->lchild=NULL;//若'('的下一個(gè)字符不為','q=(BiTNode*)malloc(sizeof(BiTNode));〃申請(qǐng)新結(jié)點(diǎn)q〃令新結(jié)點(diǎn)q的lchild域和rchild域?yàn)榭?/令當(dāng)前結(jié)點(diǎn)〃令新結(jié)點(diǎn)q的lchild域和rchild域?yàn)榭?/令當(dāng)前結(jié)點(diǎn)p的lchild域指向新申〃將新申請(qǐng)的結(jié)點(diǎn)q作為新的當(dāng)前結(jié)//若字符為',',執(zhí)行以下操作〃令當(dāng)前結(jié)點(diǎn)p為棧頂元素,但不退〃申請(qǐng)新結(jié)點(diǎn)q〃令新結(jié)點(diǎn)q的lchild域和rchild域?yàn)榭読f(s[j]==')')〃若字符為')',執(zhí)行以下操作//}printf("\n");{p=K.pin[K.top];K.top--;}else{p->data=s[j];if(s[j+1]=='('){K.top++;K.pin[K.top]=p;}}〃出棧,令當(dāng)前結(jié)點(diǎn)p為棧頂元素//若字符為字母',執(zhí)行以下操作〃令當(dāng)前結(jié)點(diǎn)p的data域?yàn)樵撟帜?/若該字母的下一個(gè)字符為'('則令當(dāng)前結(jié)點(diǎn)指針p進(jìn)棧voidPreorder(BiTNode*B,SeqStack&K)〃遍歷二叉樹函數(shù)q->lchild=NULL;q->rchild=NULL;p->lchild=q;請(qǐng)的結(jié)點(diǎn)qp=q;點(diǎn)p}}else(if(s[j]==','){p=K.pin[K.top];棧q=(BiTNode*)malloc(sizeof(BiTNode));q->lchild=NULL;q->rchild=NULL;p->rchild=q; 〃令當(dāng)前結(jié)點(diǎn)p的lchild域指向新申請(qǐng)的結(jié)點(diǎn)qp=q; 〃將新申請(qǐng)的結(jié)點(diǎn)q作為新的當(dāng)前結(jié)點(diǎn)p}else

printf("先序遍歷結(jié)果為:,printf("先序遍歷結(jié)果為:,BiTNode*p;P=B;K.top++;〃提示以下結(jié)果為先序遍歷結(jié)果//p指針指向當(dāng)前結(jié)點(diǎn)〃當(dāng)前結(jié)點(diǎn)為根結(jié)點(diǎn)〃令當(dāng)前結(jié)點(diǎn)指針p進(jìn)棧K.pin[K.top]=p;//當(dāng)棧不為空時(shí)執(zhí)行以下操作//當(dāng)棧不為空時(shí)執(zhí)行以下操作〃出棧,棧頂元素所指的結(jié)點(diǎn)作為當(dāng)前結(jié)點(diǎn)p//輸出當(dāng)前結(jié)點(diǎn)p中的字母//若當(dāng)前結(jié)點(diǎn)p的右孩子不為空,則令當(dāng)前結(jié)點(diǎn)p的右孩子進(jìn)//若當(dāng)前結(jié)點(diǎn)p的左孩子不為空,則令當(dāng)前結(jié)點(diǎn)p的左孩子進(jìn)p=K.pin[K.top];K.top--;printf("%c",p->data);if(p->rchild!=NULL)棧K.top++;K.pin[K.top]=p->rchild;if(p->lchild!=NULL)棧K.top++;K.pin[K.top]=p->lchild;printf("\n");// intmain。{chars[40]; 〃定義數(shù)組,存儲(chǔ)輸入的字符串inti;BiTNode*B; 〃定義根結(jié)點(diǎn),并申請(qǐng)存儲(chǔ)空間B=(BiTNode*)malloc(sizeof(BiTNode));SeqStackK; 〃定義棧并初始化棧K

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論