




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、最易懂的二叉樹的遞歸和非遞歸實驗代碼創(chuàng)建一顆用作實驗的二叉樹1先根(序)遍歷2中根(序)遍歷4后根(序)遍歷5測試主函數(shù)7創(chuàng)建一顆用作實驗的二叉樹/當然,你要先定義一個節(jié)點類型typedef struct NODE int val; struct NODE* left; struct NODE* right;node_t,*node_p;/*從根節(jié)點開始依次安裝圖解完成樹的創(chuàng)建,葉子節(jié)點兩個子樹為空(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;當然,這是最笨的一種生成特定二叉樹的方法先根(序)遍歷所謂先根遍歷,也就是從先遍歷根節(jié)點,然后遍歷左子樹,最后右子樹。遞歸的代碼非常簡單:void RootFirstTrav(node_p root) /*遞歸的出口*/if(root=NULL) return;/*處理根節(jié)點*/printf("%c ",root->val);/*處理左右子樹*/
5、 RootFirstTrav(root->left); RootFirstTrav(root->right);/*主函數(shù)調(diào)用測試*/int main() node_p s; s=CreatExTree(); RootFirstTrav(s); return 0;遞歸調(diào)用看起來并沒什么難點,接下來就看看非遞歸調(diào)用的style:在給出代碼之前,先分析一下我們的循環(huán)。為了再訪問完左子樹后,還能倒回去訪問右子樹,我們不得不保存當前的節(jié)點。這里用到一個叫做堆棧的數(shù)據(jù)結構,當然這里我們用數(shù)組模擬它。定義一個數(shù)組:#define MAX_NODE 100Node_p stacMAX_NODE=0
6、;Int topele=-1 /定義一個索引下標過程描述:我們遇到第一個根節(jié)點,處理,保存第一個節(jié)點數(shù)組情況為A00000topele=0;我們訪問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的右子樹,在取棧頂元素,棧為空,遍歷結束。代碼描述: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; 中根(序)遍歷遞歸比較簡單就直接上遞歸的代
8、碼了void RootSecondTrav(node_p root) if(root=NULL) return; RootSecondTrav(root->left); printf("%c ",root->val); RootSecondTrav(root->right);非遞歸調(diào)用與先根不同的是根節(jié)點的處理時機;也就是說入棧的時候不處理,等出棧的時候在處理: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);非遞歸代碼:后序遍歷的非遞歸代碼實現(xiàn)起來最為復雜。后序遍歷的順序是,左子樹,右子樹,根節(jié)點。如何從右子樹到根節(jié)點,是一個難點。這里采用一個標志位flag,來標識訪問的次數(shù),來區(qū)分是從左子樹,還是右邊子樹返回的。下面的表格表示一個堆棧的結構,第一列表示stac元素,第二列表示flag元素A1 A1B1 A1B1D1 topele=2A1B1D2 A1B12 A1B2A1B2E1->2 A2C1F1->2 A2C2依次輸出void RootLastTrav_(node_p root) /*定義一個結構體,即帶標
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é)點*/ 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; 測試主函數(shù)int main() node_p s; printf("創(chuàng)建實驗二叉樹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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025標準租房合同模板
- 2025標準個人借款合同模板下載
- 2025建筑材料供應商品混凝土居間合同
- 2025YY年技術服務合同
- 2025【黨課例文】黨課正確看待權力善修為官之德黨課【職場文檔】經(jīng)理聘任合同
- 2025年電池修復機合作協(xié)議書
- 2025年非機械驅動車輛項目合作計劃書
- 2025年造紙印染污染治理項目建議書
- 移民留學專題報道策劃方案
- 2025年增亮膜合作協(xié)議書
- 電瓶車充電安全培訓講義
- 雨季行車安全教育
- 2024-2025學年人教版八年級地理下學期全冊教案
- 人教版數(shù)學六年級下冊4.3.2圖形的放大與縮小練習卷含答案
- 《教育系統(tǒng)重大事故隱患判定指南》解讀
- 灌溉排水工程項目可行性研究報告編制
- 公益發(fā)展面試題及答案
- 解讀2024 ESC急性肺血栓栓塞癥診斷治療指南
- T-CALC 007-2025 重癥監(jiān)護病房成人患者人文關懷規(guī)范
- 中學教育基礎(上)知到課后答案智慧樹章節(jié)測試答案2025年春陜西師范大學
- 嬰幼兒物品消毒育嬰師培訓凌啟課件
評論
0/150
提交評論