


版權(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)告學(xué)生姓名學(xué)生班級(jí)學(xué)生學(xué)號(hào)指導(dǎo)老師一、實(shí)驗(yàn)內(nèi)容1) 采用二叉樹(shù)鏈表作為存儲(chǔ)結(jié)構(gòu),完成二叉樹(shù)的建立,先序、中序和后序 以及按層次遍歷的操作,求所有葉子及結(jié)點(diǎn)總數(shù)的操作。2) 輸出樹(shù)的深度,最大元,最小元。二、需求分析 遍歷二叉樹(shù)首先有三種方法,即先序遍歷,中序遍歷和后序遍歷。 遞歸方法比較簡(jiǎn)單,首先獲得結(jié)點(diǎn)指針如果指針不為空,且有左子,從左子 遞歸到下一層,如果沒(méi)有左子,從右子遞歸到下一層,如果指針為空,則結(jié) 束一層遞歸調(diào)用。直到遞歸全部結(jié)束。下面重點(diǎn)來(lái)講述非遞歸方法:首先介紹先序遍歷: 先序遍歷的順序是根 左 右,也就是說(shuō)先訪問(wèn)根結(jié)點(diǎn)然后訪問(wèn)其左子再然后 訪問(wèn)其右子。具體算
2、法實(shí)現(xiàn)如下:如果結(jié)點(diǎn)的指針不為空,結(jié)點(diǎn)指針入棧, 輸出相應(yīng)結(jié)點(diǎn)的數(shù)據(jù),同時(shí)指針指向其左子,如果結(jié)點(diǎn)的指針為空,表示左 子樹(shù)訪問(wèn)結(jié)束, 棧頂結(jié)點(diǎn)指針出棧, 指針指向其右子, 對(duì)其右子樹(shù)進(jìn)行訪問(wèn), 如此循環(huán),直至結(jié)點(diǎn)指針和棧均為空時(shí),遍歷結(jié)束。再次介紹中序遍歷:中序遍歷的順序是左 根 右,中序遍歷和先序遍歷思想差不多,只是打印順 序稍有變化。具體實(shí)現(xiàn)算法如下:如果結(jié)點(diǎn)指針不為空,結(jié)點(diǎn)入棧,指針指 向其左子,如果指針為空,表示左子樹(shù)訪問(wèn)完成,則棧頂結(jié)點(diǎn)指針出棧,并 輸出相應(yīng)結(jié)點(diǎn)的數(shù)據(jù),同時(shí)指針指向其右子,對(duì)其右子樹(shù)進(jìn)行訪問(wèn)。如此循 環(huán)直至結(jié)點(diǎn)指針和棧均為空,遍歷結(jié)束。最后介紹后序遍歷: 后序遍歷的順
3、序是左 右 根,后序遍歷是比較難的一種,首先需要建立兩個(gè) 棧,一個(gè)用來(lái)存放結(jié)點(diǎn)的指針,另一個(gè)存放標(biāo)志位,也是首先訪問(wèn)根結(jié)點(diǎn), 如果結(jié)點(diǎn)的指針不為空, 根結(jié)點(diǎn)入棧,與之對(duì)應(yīng)的標(biāo)志位也隨之入標(biāo)志位棧, 并賦值 0,表示該結(jié)點(diǎn)的右子還沒(méi)有訪問(wèn),指針指向該結(jié)點(diǎn)的左子,如果結(jié) 點(diǎn)指針為空,表示左子訪問(wèn)完成,父結(jié)點(diǎn)出棧,與之對(duì)應(yīng)的標(biāo)志位也隨之出 棧,如果相應(yīng)的標(biāo)志位值為 0,表示右子樹(shù)還沒(méi)有訪問(wèn),指針指向其右子, 父結(jié)點(diǎn)再次入棧,與之對(duì)應(yīng)的標(biāo)志位也入棧,但要給標(biāo)志位賦值為1,表示右子訪問(wèn)過(guò)。如果相應(yīng)的標(biāo)志位值為 1,表示右子樹(shù)已經(jīng)訪問(wèn)完成,此時(shí)要 輸出相應(yīng)結(jié)點(diǎn)的數(shù)據(jù),同時(shí)將結(jié)點(diǎn)指針賦值為空,如此循環(huán)直至結(jié)
4、點(diǎn)指針和 棧均為空,遍歷結(jié)束。三、詳細(xì)設(shè)計(jì)源代碼:#include<stdio.h>#define MAX 100 / 表示棧的最大容量 #define FULL 99/ 表示棧滿#define EMPTY -1/ 表示??誸ypedef struct Tnode / 定義結(jié)點(diǎn)char data;/存儲(chǔ)結(jié)點(diǎn)數(shù)據(jù)struct Tnode *left;/ 定義結(jié)點(diǎn)左子指針 struct Tnode *right;/ 定義右子指針 Tnode,*Pnode;/ 聲明 Tnode 類型的變量和指針 typedef struct Stack/ 定義棧Pnode pnodeMAX;/ 存放數(shù)據(jù)
5、int p ; /棧頂指針Stack,*Pstack;定義Stack類型的變量和指針 void Push (Pstack pstack,Pnode pnode)/入棧 pstack->p +;pstack->pnodepstack->p = pnode;/ 賦值Pnode Pop(Pstack pstack)/出 棧return pstack->pnodepstack->p-;Pnode Top (Pstack pstack)/看 棧頂元素return pstack->pnodepstack->p;int Isempty (Pstack pstack)
6、/ 棧判空if(pstack->p=EMPTY)return 1;elsereturn 0;int Isfull (Pstack pstack )/棧滿if (pstack ->p=FULL)return 1;elsereturn 0;void Initstack (Pstack pstack)/ 初始化棧pstack->p=EMPTY;void Inittnode(Pnode root,Pnode left,Pnode right,char data)/ 初始化結(jié)點(diǎn) root->left=left;root->right = right;root->dat
7、a = data;void PreorderR(Pnode proot)/ 遞歸先序遍歷算法if(proot)printf("%2c",proot->data);PreorderR(proot->left);PreorderR(proot->right);void InorderR(Pnode proot)/ 遞歸中序遍歷算法if(proot)InorderR(proot->left); printf("%2c",proot->data);InorderR(proot->right);void PostorderR(P
8、node proot)/ 遞歸后序遍歷算法if(proot)PostorderR(proot->left);PostorderR(proot->right);printf("%2c",proot->data);void PreorderI(Pnode proot,Pstack pstack)/ 非遞歸先序遍歷算法 Initstack(pstack);/ 初始化棧 while(proot|!Isempty(pstack)/ 如果棧空并且結(jié)點(diǎn)指針空,則結(jié)束循環(huán) if(proot)printf("%2c",proot->data);if
9、(Isfull(pstack)/ 如果棧滿不能執(zhí)行入棧操作printf(" 棧滿,不能執(zhí)行入棧操作! ");return;Push(pstack,proot); 入棧proot=proot->left;/ 指針指向左子elseif(Isempty(pstack)/ ??諘r(shí)不能出棧printf(" 棧空,不能執(zhí)行出棧操作! ");return;proot = Pop(pstack);/ 執(zhí)行出棧操作proot=proot->right;/ 指針指向右子void lnorderl(Pnode proot,Pstack pstack)/ 非遞歸中序
10、遍歷算法Initstack(pstack);/ 初始化棧while(proot|!lsempty(pstack)/ 循環(huán)結(jié)束條件if(proot)if(Isfull(pstack)printf(" 棧滿,不能執(zhí)行入棧操作! ");return;Push(pstack,proot); 執(zhí)行入棧操作proot = proot->left;/ 指針指向左子elseif(Isempty(pstack)printf(" 棧空,不能執(zhí)行出棧操作! ");return ;proot = Pop(pstack);/ 出棧printf("%2c"
11、,proot->data);/ 打印數(shù)據(jù)proot=proot->right;/ 指針指向右子void PostorderI(Pnode proot,Pstack pstack)/ 非遞歸后續(xù)遍歷算法int flagsMAX;/ 定義標(biāo)志位棧int p =-1;/ 初始化標(biāo)志位棧int flag;/ 存放標(biāo)志位Initstack(pstack);/ 初始化棧 while(proot|!Isempty(pstack)/ 循環(huán)結(jié)束條件 if(proot)if(Isfull(pstack)printf(" 棧滿,不能執(zhí)行入棧操作! ");return ;flags+p
12、 = 0;/ 標(biāo)志位置 0,并入棧Push(pstack,proot); 結(jié)點(diǎn)入棧 proot=proot->left;/ 指針指向左子elseproot = Pop(pstack);/ 指針出棧flag = flagsp-;/ 相應(yīng)標(biāo)志位出棧if(flag=0)/ 如果標(biāo)志位為 0 表示右子還未訪問(wèn)過(guò)flag =1;/將標(biāo)志位置 1,右子已訪問(wèn)flags+p = flag;/ 標(biāo)志位入棧Push(pstack,proot); 結(jié)點(diǎn)入棧proot = proot->right;/ 指針指向右子elseprintf("%2c",proot->data);/
13、打印數(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,NULL,'D');Inittnode(&E,NULL,NULL,'E');
14、Inittnode(&F,&G ,NULL,'F');Inittnode(&G ,NULL,NULL,'G'); printf(" 你定義的樹(shù)的結(jié)構(gòu)是: n");/* 一下是調(diào)用相應(yīng)的函數(shù)輸出遍歷結(jié)果*/printf("A(B(D)C(E F(G)n");printf("= 下面是遍歷結(jié)果 =n"); printf("= 遞歸先序遍歷: =n"); PreorderR(&A);printf("n");printf("= 非
15、遞歸先序遍歷: =n"); PreorderI(&A,&stack);printf("n");printf("= 遞歸中序遍歷: =n"); InorderR(&A);printf("n");printf("= 非遞歸中序遍歷: =n"); InorderI(&A,&stack);printf("n");printf("= 遞歸后序遍歷: =n"); PostorderR(&A);printf("n"
16、;);printf("= 非遞歸后序遍歷: =n"); PostorderI(&A,&stack);printf("n");五、遇到的問(wèn)題及解決辦法 這部分我主要遇到如下兩個(gè)問(wèn)題,其內(nèi)容和解決方法如下所列: 執(zhí)行程序時(shí)程序停止運(yùn)行,其效果如圖:解決方法:看到程序停止運(yùn)行,推測(cè)可能的原因:遇到死循環(huán)、參數(shù)設(shè)置不合 理或者結(jié)構(gòu)體沒(méi)有造好。首先對(duì)結(jié)構(gòu)體進(jìn)行了檢查,各個(gè)成員聲明正常無(wú)誤,在 對(duì)程序進(jìn)行調(diào)試,程序正常跳出循環(huán),因此最可能是自定義函數(shù)的參數(shù)設(shè)置的不 合理,因此對(duì)調(diào)用的自定義函數(shù)進(jìn)行相應(yīng)的改動(dòng), 將參數(shù)由具體類型改為指針類 型后,程序正
17、常運(yùn)行。程序不停的輸出同一個(gè)結(jié)點(diǎn)的數(shù)據(jù),其效果入圖:DDDODLDDDDDDDDCDDDDDDDDDDDDDDODEDDDDDDDDCnDDDDBDODEDDDDDDDEBBD珈DDDDDDDDDDDODD *IDDDDDDrDDDDTEDDDDDDDDOEDDDDDDDDrDTiDDDDDCDrDDDDDDDDrDDDDDTCDDDDDDDDOEEDDDOD DODDDIlDDDDDDDDCDDDDDDDDDDDDDDDmDLDIWDDDDCnDDDDDEmDDIWDDOECDrDDDDDDDDDDDDDDDDDMDDDDDDEDDDDDDDDDDDDDDDDDMFHTDDDDDDDITDD
18、DDDDDDDDDDDDDDDDDMDDDJDDDDDDDJDmDDl®DOljlJDDDDDDUlXJLiBDi)DiJDUl'lJDDDJDJUlJDBDDDDD£llDDDD)LJDlJlJDDBDDJDLlJLiDDDDJLJUDlJDDDJDJDD hDDDDDDDDDDDDDDDDDDDDDDDDDDDMDDDDDDDDDDD 師 DDDDDDDDDDDDMDDDDDEDDDDDDDDDDDDJDODD ” DJDODDDDDDIWDCDDDDDODODDDDDDDODDDDDDJDDDCDDEDDDDDIXDDDDDDCIDDDDDDDDODDDDDD
19、DDDD joJDCDDDDDDIWDCDDDDDCDtBDDDDDDOnDDDBDDDnDCDDDDDDDDDCDDDDDDODCDDDDDODDDDDDDDDOnD pi®DDDCDDDDDDDECDDDDDDDDDDDDDDODDDDDDDDDECDDDDDDDDElDDDDDDDK)DDDDDDDDDCDDDDX)DD tDDDODrDDnDDDDDIlDBDnDnDDnrDDDOmnrDDDDDDDEIinDDDDBDODnDDnDDDnnirinDDDDDnPDDromnDI)D3XDCEDDDDDDDDDDDDDDXDDDDDJ>DDDDDDDDDDDELDDDD
20、DXDDDDDDDDDDDDDDDDD®DCDDD3I>DDD pDODDDrDDDDDOODCDDDDUDDDDDDDDDDDDWDBDBDDDCDDDDDBDDDDDDDDDDDIXDDDDDDDDDBDDDiDBDDDr; pDDDDDDDEDDDOliDDDDDDDDDCDDDDDDDDDimDDDDDDDDDDDDDDDinDDDDimXDDDD 血 DDnDDDDDDUJD 叵 DD0DC'LrPDD3DDDEEDDDDDDD0rPDDDD3ErTiriDDD3DrrrDDDDDDGDrDEDDDDDCEDI)DDDDDCriDDD3D3ErED0DDDLDDDDDDE'EEDDD)DDDOrDDEDDDODL!DHDDDDDCDDDDD)DjDCDDDDDDDCEDDDDDDDOLiDDDBDODD bDODCmDDDDDDnffiDDDDDDDDDDDDDDDDDDDDDDDDDDCDDDDDDDCnCDDDDDDDDCDDDDDDDnDIinDDDDnDD DDDDLlLLiDDJDJDEEDDDBDDDOLUDDDDDJElDLiDDDJDLlJL
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校介護(hù)實(shí)訓(xùn)室設(shè)備采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 體育館土石方運(yùn)輸平整協(xié)議
- 醫(yī)療器械操作規(guī)范與標(biāo)準(zhǔn)作業(yè)指導(dǎo)書(shū)
- 環(huán)保理念與低碳生活實(shí)踐方法作業(yè)指導(dǎo)書(shū)
- 三農(nóng)人才培養(yǎng)及實(shí)施方案指導(dǎo)書(shū)
- 新能源汽車充電紅燈
- 新能源汽車充電樁難題
- 品牌管理與推廣操作手冊(cè)
- 商家自行配送怎么查物流
- 施工建筑設(shè)計(jì)說(shuō)明
- 2025年醫(yī)保知識(shí)考試題庫(kù)及答案-醫(yī)保定點(diǎn)醫(yī)療機(jī)構(gòu)管理流程詳解試題
- 2025年鐵嶺衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)學(xué)生專用
- The uses of infinitives 動(dòng)詞不定式(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教新目標(biāo)Go For It!英語(yǔ)八年級(jí)上冊(cè)
- (一模)2025屆安徽省“江南十?!备呷?lián)考地理試卷(含官方答案)
- 數(shù)學(xué)-2025屆安徽省江南十校聯(lián)考試題和解析
- 普通高中學(xué)生綜合素質(zhì)評(píng)價(jià)自我陳述報(bào)告
- 《展示設(shè)計(jì)》課件-第一章 展示設(shè)計(jì)概述
- 介入手術(shù)術(shù)中安全護(hù)理措施
- 投資銀行學(xué)第4版- 課件匯 馬曉軍 第1-4章 投資銀行概述-上市公司再融資
- 學(xué)生常見(jiàn)傳染病的預(yù)防
- 2025年月度工作日歷含農(nóng)歷節(jié)假日電子表格版
評(píng)論
0/150
提交評(píng)論