數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-二叉樹的實(shí)現(xiàn)與遍歷_第1頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-二叉樹的實(shí)現(xiàn)與遍歷_第2頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-二叉樹的實(shí)現(xiàn)與遍歷_第3頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-二叉樹的實(shí)現(xiàn)與遍歷_第4頁
數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-二叉樹的實(shí)現(xiàn)與遍歷_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、-!數(shù)據(jù)結(jié)構(gòu)第六次實(shí)驗(yàn)報(bào)告學(xué)生姓名 學(xué)生班級 學(xué)生學(xué)號 指導(dǎo)老師一、實(shí)驗(yàn)內(nèi)容1)采用二叉樹鏈表作為存儲結(jié)構(gòu),完成二叉樹的建立,先序、中序和后序 以及按層次遍歷的操作,求所有葉子及結(jié)點(diǎn)總數(shù)的操作。2)輸出樹的深度,最大元,最小元。二、需求分析遍歷二叉樹首先有三種方法,即先序遍歷,中序遍歷和后序遍歷。遞歸方法比較簡單,首先獲得結(jié)點(diǎn)指針如果指針不為空,且有左子,從左子 遞歸到下一層,如果沒有左子,從右子遞歸到下一層,如果指針為空,則結(jié) 束一層遞歸調(diào)用。直到遞歸全部結(jié)束。下面重點(diǎn)來講述非遞歸方法:首先介紹先序遍歷:先序遍歷的順序是根 左右,也就是說先訪問根結(jié)點(diǎn)然后訪問其左子再然后 訪問其右子。具體算法

2、實(shí)現(xiàn)如下:如果結(jié)點(diǎn)的指針不為空,結(jié)點(diǎn)指針入棧, 輸出相應(yīng)結(jié)點(diǎn)的數(shù)據(jù),同時(shí)指針指向其左子,如果結(jié)點(diǎn)的指針為空,表示左 子樹訪問結(jié)束,棧頂結(jié)點(diǎn)指針出棧,指針指向其右子,對其右子樹進(jìn)行訪問, 如此循環(huán),直至結(jié)點(diǎn)指針和棧均為空時(shí),遍歷結(jié)束。再次介紹中序遍歷:中序遍歷的順序是左 根右,中序遍歷和先序遍歷思想差不多,只是打印順 序稍有變化。具體實(shí)現(xiàn)算法如下:如果結(jié)點(diǎn)指針不為空,結(jié)點(diǎn)入棧,指針指 向其左子,如果指針為空,表示左子樹訪問完成,則棧頂結(jié)點(diǎn)指針出棧,并 輸出相應(yīng)結(jié)點(diǎn)的數(shù)據(jù),同時(shí)指針指向其右子,對其右子樹進(jìn)行訪問。如此循 環(huán)直至結(jié)點(diǎn)指針和棧均為空,遍歷結(jié)束。最后介紹后序遍歷:后序遍歷的順序是左 右

3、根,后序遍歷是比較難的一種,首先需要建立兩個(gè) 棧,一個(gè)用來存放結(jié)點(diǎn)的指針,另一個(gè)存放標(biāo)志位,也是首先訪問根結(jié)點(diǎn), 如果結(jié)點(diǎn)的指針不為空,根結(jié)點(diǎn)入棧,與之對應(yīng)的標(biāo)志位也隨之入標(biāo)志位棧, 并賦值0,表示該結(jié)點(diǎn)的右子還沒有訪問,指針指向該結(jié)點(diǎn)的左子,如果結(jié) 點(diǎn)指針為空,表示左子訪問完成,父結(jié)點(diǎn)出棧,與之對應(yīng)的標(biāo)志位也隨之出 棧,如果相應(yīng)的標(biāo)志位值為0,表示右子樹還沒有訪問,指針指向其右子, 父結(jié)點(diǎn)再次入棧,與之對應(yīng)的標(biāo)志位也入棧,但要給標(biāo)志位賦值為1,表示右子訪問過。如果相應(yīng)的標(biāo)志位值為 1,表示右子樹已經(jīng)訪問完成,此時(shí)要 輸出相應(yīng)結(jié)點(diǎn)的數(shù)據(jù),同時(shí)將結(jié)點(diǎn)指針賦值為空,如此循環(huán)直至結(jié)點(diǎn)指針和 棧均為空

4、,遍歷結(jié)束。三、詳細(xì)設(shè)計(jì)源代碼:#includevstdio.h>#define MAX 100 /表示棧的最大容量#define FULL 99 表示棧滿#define EMPTY -1 表示??誸yp edef struct Tnode / 定義結(jié)點(diǎn)char data;/存儲結(jié)點(diǎn)數(shù)據(jù)struct Tnode *left;/定義結(jié)點(diǎn)左子指針struct Tnode *right;/ 定義右子指針 Tnode,*Pnode;/聲明Tnode類型的變量和指針 typ edef struct Stack/ 定義棧Pnode pnodeMAX;/ 存放數(shù)據(jù)int p;/棧頂指針Stack,*P

5、stack;/定義Stack類型的變量和指針 void Push (P stack p stack ,Pn ode pn ode)/入棧 p stack- >p +;p stack- >pn ode p stack- >p = pn ode;/ 賦值Pnode Pop(P stack p stack)/出 棧return p stack- >pn ode p stack- >p-;Pnode Top (P stack pstack)/看棧頂元素return p stack- >pn ode pstack- >p;int Ise mpty (P stac

6、k p stack)/ 棧判空if(p stack-> p=E MPTY) return 1;elsereturn 0;int Isfull (Pstack pstack )/ 棧滿if (p stack ->p=FULL)return 1;elsereturn 0;void Initstack (Pstack pstack)/ 初始化棧p stack-p=EMPTY;void Inittnode(Pnode root,Pnode left,Pnode rightchar data)/ 初始化結(jié)點(diǎn)root->left=left;root->right = right;r

7、oot->data = data;void P reorderR( Pnode p root)/ 遞歸先序遍歷算法if(p root)p rintf("%2c", proot->data);P reorderR (p root->left);P reorderR (p root->right);void InorderR(Pnode proot)/ 遞歸中序遍歷算法if(p root)InorderR (p root->left);p rintf("%2c", proot->data);InorderR (p root

8、->right);void Po storderR( Pnode p root)/ 遞歸后序遍歷算法if(p root)Po storderR (p root->left);Po storderR (p root->right);p rintf("%2c", proot->data);void P reorderI( Pnode p root, Pstack p stack)/ 非遞歸先序遍歷算法Initstack( pstack);/ 初始化棧while(proot|!lsempty(pstack)/如果棧空并且結(jié)點(diǎn)指針空,則結(jié)束循環(huán)if(p ro

9、ot)p rintf("%2c", proot->data);if(Isfull(pstack)/如果棧滿不能執(zhí)行入棧操作printf("棧滿,不能執(zhí)行入棧操作!");return;Push( pstack ,p root);/ 入棧 proot=proot->left;/ 指針指向左子 elseif(Isempty(pstack)/??諘r(shí)不能出棧printf("??眨荒軋?zhí)行出棧操作!");return;proot = Pop(p stack);/ 執(zhí)行出棧操作 proot=proot->right;/ 指針指向右

10、子void InorderI( Pnode p root, Pstack p stack)/ 非遞歸中序遍歷算法lnitstack( pstack);/ 初始化棧while(proot|!lsempty(pstack)/ 循環(huán)結(jié)束條件if(p root)if(Isfull( pstack)printf("棧滿,不能執(zhí)行入棧操作!");return;Push( pstack ,p root);/ 執(zhí)行入棧操作proot = proot->left;/ 指針指向左子 elseif(Ise mp ty( pstack)printf("???,不能執(zhí)行出棧操作!&qu

11、ot;);return ;p root = Pop(p stack);/ 出棧printf("%2c",proot->data);/ 打印數(shù)據(jù)proot=proot->right;/ 指針指向右子void PostorderI( Pnode p root, Pstack p stack)/ 非遞歸后續(xù)遍歷算法 int flagsMAX;/定義標(biāo)志位棧int p =-1;/初始化標(biāo)志位棧int flag;/存放標(biāo)志位Initstack( pstack);/ 初始化棧while(proot|!lsempty(pstack)/ 循環(huán)結(jié)束條件if(p root)if(I

12、sfull( pstack)printf("棧滿,不能執(zhí)行入棧操作!"); return ;flags+p = 0;/標(biāo)志位置0,并入棧 Push( pstack ,p root);/ 結(jié)點(diǎn)入棧 proot=proot->left;/ 指針指向左子elseproot = Pop(p stack);/ 指針出棧flag = flagsp-;/相應(yīng)標(biāo)志位出棧if(flag=0)/如果標(biāo)志位為0表示右子還未訪問過 flag =1;/將標(biāo)志位置1,右子已訪問 flags+p = flag;/ 標(biāo)志位入棧Push( pstack ,p root);/ 結(jié)點(diǎn)入棧proot = p

13、root->right;/ 指針指向右子 elseprintf("%2c",proot->data);/ 打印數(shù)據(jù) proot = NULL;/將結(jié)點(diǎn)指針置空void main ()Tnode A,B,C,D,E,F,G;/ 聲明結(jié)點(diǎn)變量Stack stack;/聲明棧Inittnode(&A,&B,&C,'A');/ 初始化結(jié)點(diǎn)Inittnode(&B,NULL,&D,'B');Inittnode(&C,&E,&F,C);Inittnode(&D,NULL,

14、NULL,'D');lnittnode(&E,NULL,NULL,'E');lnittnode(&F,&G ,NULL,'F');Inittnode(&G ,NULL,NULL,'G'); printf("你定義的樹的結(jié)構(gòu)是:n");*/* 一下是調(diào)用相應(yīng)的函數(shù)輸出遍歷結(jié)果p rintf("A(B(D)C(E F(G)n");下面是遍歷結(jié)果 遞歸先序遍歷:P reorderR(&A);p rintf("n");p rintf(

15、9;"非遞歸先序遍歷:n");P reorderl(&A,&stack);p rintf("n");p rintf('"遞歸中序遍歷:n");InorderR(&A);P rintf("n");p rintf('"非遞歸中序遍歷:An");InorderI(&A,& stack);p rintf("n");p rintf("遞歸后序遍歷:An");PostorderR(&A);p rintf(

16、"n");p rintf("非遞歸后序遍歷:n");P ostorderl(&A,& stack);p rintf("n");五、遇到的問題及解決辦法這部分我主要遇到如下兩個(gè)問題,其內(nèi)容和解決方法如下所列:執(zhí)行程序時(shí)程序停止運(yùn)行,其效果如圖: = *匚應(yīng)卯叭WFL勺De加Q円MPTTcthn日償琥茁中、二列和毆二叉詞卻lS0,DcbLig=冏的逅-.,1回,璉 你定爛樹的結(jié)構(gòu)是=ACB(D)CCE F(G)I=二二二=下面是遍歷結(jié)甲=二f J二叉刪遍歷exe已停It工作Wmdowi可檢查該問S妁翼姿方星嘩聯(lián)機(jī)檢直孵決方

17、案并黃®該桎序X垂看眉題詳鋁星E解決方法:看到程序停止運(yùn)行,推測可能的原因:遇到死循環(huán)、參數(shù)設(shè)置不合理或者結(jié)構(gòu)體沒有造好。首先對結(jié)構(gòu)體進(jìn)行了檢查,各個(gè)成員聲明正常無誤,在對程序進(jìn)行調(diào)試,程序正常跳出循環(huán),因此最可能是自定義函數(shù)的參數(shù)設(shè)置的不合理,因此對調(diào)用的自定義函數(shù)進(jìn)行相應(yīng)的改動, 將參數(shù)由具體類型改為指針類型后,程序正常運(yùn)行。程序不停的輸出同一個(gè)結(jié)點(diǎn)的數(shù)據(jù),其效果入圖:*_ C:U$ei 典VJ FpXkgp'mnMj nSS哼結(jié)吃1 二 H 1?r的童邱二盤悄胴詞預(yù) by 趴tnyprog g” 10湎£心枕1£五贏01)115阪£|0帀五

18、五頑DDDDEE匸EiDDDDEWJjDDDDDODI®麗而dSdDUDDDBDODD *DODDDEDDDDDDDDDDDDDDDDDDDDDDODDDEDDDDDDDEDrDDDDDDODEDDDDDDDDDDDDDDDDDDEDDDODDDD DODODEDDUDDDDEljDBDlJDDmEDElJJDDDlDiiUDDDDIDLDDDDLDOEEDDlJDDjmDlJDlJDDDDDEDDDJDDDD MDDDDDDDDDDDDDDDDDDDDDDDDDMrnTDDDDDDDBrDDDDJDDDDDDDDDDDDDMDDDDDKWDDDDKTD lJDJHJiJlJDDUD

19、UDUDLLiUDUUUiJULlJDDDJD-JLlDiiUDUDUElJLlJDDUJLlDUlJlJDWDDJUl;LDUDUUULDDljUDD2)l>JUD ©MDODDDDDDDDDrJDDDDDDDDDDDD 梵iDODMDDDDDDBrDDDDDDDDDDDDDDDDCDDDDDDDDDDDDDinnODD pD;)XlJDLiDUDUDDDlJDUDDODDDLDDDU:)D.JDLDIiUDDODEDLDDDDDXIDLiDUDUDDLDIiDDUODDCl!DDDU:)I>DDD 'bMDOnmDMDDDEUDDDDDDDPnDTlDMMDn

20、DDnDDDDBirDDDDDDODMiDDDDDmiDDDDDDDWtiriDTlTimX J)DDDC)DCDPDDDDDEBDDDDDDXEDDDD:)JDDtDI'DDDDDDDLDDDDJ)DODDDDDDDDDDDDDDDDDDDDCDDD:)I>3DD bmnDTwriD 皿 rorrnDDDDDDnDnDnDTnmrTriDDDDDmiiTiDnDTinfjmnDDDDDrriiDriDDDDnDriDBEiraTDDD DDDXDEDDDDDDDDDDDDDD0XDDDDDJ)>JDEDDDDDDDCELDDDDDXnDDDDDDDDCDDDDDDDXDC

21、DDDBI>3DD t)D3DrrrTiBnDmnErirmDT)DDnDrrDDD0DTriDTinDr)DDnirrDr)DPD0DrTiDnDninErriTiDT)DDDPDrnDD0WD. DDDDODCDDDDDDDLEDDDDDDXEDDDDOCrDDtDIjDDDDDCDLDDDDDDODCDDDDDDOLEDDDDDDXDCDDDOEFJDDi" I)DDDrjDriDBDDDDDLEDDDDDDDC'DiDDDD:)DDDriD'DDDDDDn)DirDDDBDGDriDDDDDDDEEPDDDDDDODiEDDD:3D3DD UDODGDE

22、DDDDDaDDEDDDDDDDC'EDDEDJDJDLiDDDDDDDEErEDDDBDGDLiDDDDDDDLEDDDDDDDODEDDDODDDIj toODDDEDDDDDaDDEDDDDDDnODEDrDDDDDrDDDDDDDrTrDDDDDDODEDDDDDODDEDDDDDDDODEDPDOroDr ijD3mEDnuDDDDDEDDDBDDDt)L'DDLLr3DJD£DliUDDDDClJJDlLDDDJJDGDLilJElJDD0DDEDUD.UDDDDLEDDlJ3D3DD toD:5DDDEDDDDDDDE-DDDDDDDDDDDDDD:)>DIiDDDDDDCrDDDDDDDDEDDDDDDDCCDDDDDDDDDEDDD)I>DD lJDJDL)iJlJDBDDUJULLD.UDUDDiX)LlJUDUJDJDLDiiUDUDULlJLlJDDDJ)DULlJUDUDDJULLD.UDUDDLX)iJlJUDDJDJ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論