版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、最易懂的二叉樹的遞歸和非遞歸實(shí)驗(yàn)代碼創(chuàng)建一顆用作實(shí)驗(yàn)的二叉樹1先根(序)遍歷2中根(序)遍歷4后根(序)遍歷5測(cè)試主函數(shù)7創(chuàng)建一顆用作實(shí)驗(yàn)的二叉樹/當(dāng)然,你要先定義一個(gè)節(jié)點(diǎn)類型typedef struct NODE int val; struct NODE* left; struct NODE* right;node_t,*node_p;/*從根節(jié)點(diǎn)開始依次安裝圖解完成樹的創(chuàng)建,葉子節(jié)點(diǎn)兩個(gè)子樹為空(null)*/node_t* CreatExTree() node_p root; root=malloc(sizeof(node_t); if(root=NULL) exit(1); root-
2、>val='A' root->left=malloc(sizeof(node_t); root->left->val='B' root->left->left=malloc(sizeof(node_t); root->left->left->val='D' root->left->left->left=NULL; root->left->left->right=NULL; root->left->right=malloc(sizeof(node_
3、t); root->left->right->val='E' root->left->right->left=NULL; root->left->right->right=NULL; root->right=malloc(sizeof(node_t); root->right->val='C' root->right->right=NULL; root->right->left=malloc(sizeof(node_t); root->right->lef
4、t->val='F' root->right->left->left=NULL; root->right->left->right=NULL; return root;當(dāng)然,這是最笨的一種生成特定二叉樹的方法先根(序)遍歷所謂先根遍歷,也就是從先遍歷根節(jié)點(diǎn),然后遍歷左子樹,最后右子樹。遞歸的代碼非常簡(jiǎn)單:void RootFirstTrav(node_p root) /*遞歸的出口*/if(root=NULL) return;/*處理根節(jié)點(diǎn)*/printf("%c ",root->val);/*處理左右子樹*/
5、 RootFirstTrav(root->left); RootFirstTrav(root->right);/*主函數(shù)調(diào)用測(cè)試*/int main() node_p s; s=CreatExTree(); RootFirstTrav(s); return 0;遞歸調(diào)用看起來并沒什么難點(diǎn),接下來就看看非遞歸調(diào)用的style:在給出代碼之前,先分析一下我們的循環(huán)。為了再訪問完左子樹后,還能倒回去訪問右子樹,我們不得不保存當(dāng)前的節(jié)點(diǎn)。這里用到一個(gè)叫做堆棧的數(shù)據(jù)結(jié)構(gòu),當(dāng)然這里我們用數(shù)組模擬它。定義一個(gè)數(shù)組:#define MAX_NODE 100Node_p stacMAX_NODE=0
6、;Int topele=-1 /定義一個(gè)索引下標(biāo)過程描述:我們遇到第一個(gè)根節(jié)點(diǎn),處理,保存第一個(gè)節(jié)點(diǎn)數(shù)組情況為A00000topele=0;我們?cè)L問A的左子樹,不為空,處理,入棧AB0000topele=1再繼續(xù)訪問左子樹,不為空,處理,入棧ABD000topele=2再繼續(xù)訪問左子樹,為空,出棧,取出棧頂元素B;AB0000topele=0處理B的右子樹E,E的左子樹不為空,不入棧,處理右子樹,為空,不入棧。再出棧,取元素A,處理A的右子樹C,C的左子樹不為空,入棧,處理C。然后,處理C的左子樹F,F(xiàn)的左右子樹為空,去棧頂元素C,處理C的右子樹,在取棧頂元素,棧為空,遍歷結(jié)束。代碼描述:vo
7、id RootFirstTrav_(node_p root) node_p stacMAX_NODE; int topele=-1; if(root=NULL) exit(1); node_p p1;p1=root;/循環(huán)出口,堆棧為空 while(p1!=NULL|topele!=-1) while(p1!=NULL) /*處理數(shù)據(jù)*/ printf("%c ",p1->val); stac+topele=p1; p1=p1->left; if(topele!=-1) p1=stactopele->right; 中根(序)遍歷遞歸比較簡(jiǎn)單就直接上遞歸的代
8、碼了void RootSecondTrav(node_p root) if(root=NULL) return; RootSecondTrav(root->left); printf("%c ",root->val); RootSecondTrav(root->right);非遞歸調(diào)用與先根不同的是根節(jié)點(diǎn)的處理時(shí)機(jī);也就是說入棧的時(shí)候不處理,等出棧的時(shí)候在處理:void RootSecondTrav_(node_p root) node_p stacMAX_NODE; int topele=-1; if(root=NULL) exit(1); while(
9、root!=NULL | topele!=-1) while(root!=NULL) stac+topele=root; root=root->left; if(topele!=-1) root=stactopele-; printf("%c ",root->val); root=root->right; 后根(序)遍歷依然先上遞歸代碼:void RootLastTrav(node_p root) if(root=NULL) return; RootLastTrav(root->left); RootLastTrav(root->right);
10、 printf("%c ",root->val);非遞歸代碼:后序遍歷的非遞歸代碼實(shí)現(xiàn)起來最為復(fù)雜。后序遍歷的順序是,左子樹,右子樹,根節(jié)點(diǎn)。如何從右子樹到根節(jié)點(diǎn),是一個(gè)難點(diǎn)。這里采用一個(gè)標(biāo)志位flag,來標(biāo)識(shí)訪問的次數(shù),來區(qū)分是從左子樹,還是右邊子樹返回的。下面的表格表示一個(gè)堆棧的結(jié)構(gòu),第一列表示stac元素,第二列表示flag元素A1 A1B1 A1B1D1 topele=2A1B1D2 A1B12 A1B2A1B2E1->2 A2C1F1->2 A2C2依次輸出void RootLastTrav_(node_p root) /*定義一個(gè)結(jié)構(gòu)體,即帶標(biāo)
11、志位的堆棧*/ typedef struct STAC node_p stac; int flag; stac_f; /*定義堆棧數(shù)組*/ stac_f StacMAX_NODE; int topele=-1; if(root=NULL) exit(1); while(root!=NULL|topele!=-1) while(root!=NULL) /*第一次遍歷根節(jié)點(diǎn)*/ topele+; Stactopele.stac=root; Stactopele.flag=1; root=root->left; /*如果元素不為空,且是第二次遍歷,則處理元素*/ while(topele!=-
12、1&&Stactopele.flag=2) root=Stactopele-.stac; printf("%c ",root->val); if(topele!=-1) Stactopele.flag=2; root=Stactopele.stac->right; 測(cè)試主函數(shù)int main() node_p s; printf("創(chuàng)建實(shí)驗(yàn)二叉樹n"); s=CreatExTree(); printf("n"); printf("先序遍歷n"); RootFirstTrav(s); putchar(10); RootFirstTrav_(s); putchar(10); printf("中序遍歷n"); RootSecondTrav(s)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 病例分析應(yīng)用研究報(bào)告
- 2024年汽車空調(diào)系統(tǒng)項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告
- 班級(jí)紀(jì)律管理方案
- 玻璃雨搭施工方案
- 玻璃采購?fù)稑?biāo)方案
- 玻璃基板行業(yè)研究報(bào)告
- 玻璃公園建設(shè)方案
- 猜拳器課程設(shè)計(jì)
- 版畫動(dòng)漫插畫課程設(shè)計(jì)
- 愛育特色托班課程設(shè)計(jì)
- 20200310公園安全風(fēng)險(xiǎn)辨識(shí)清單
- 華中科技大學(xué)官方信紙
- 60立方油罐容積細(xì)表
- WI-QA-02-034A0 燈具成品檢驗(yàn)標(biāo)準(zhǔn)
- 農(nóng)業(yè)信息技術(shù) chapter5 地理信息系統(tǒng)
- 部編版六年級(jí)上語文閱讀技巧及解答
- 斯派克max操作手冊(cè)
- 項(xiàng)目四 三人表決器ppt課件
- 結(jié)合子的機(jī)械加工工藝規(guī)程及銑槽的夾具設(shè)計(jì)
- 林武樟 完整陽宅講義 筆記版[方案]
- 《會(huì)滾的汽車》ppt課件
評(píng)論
0/150
提交評(píng)論