

下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第四次上機(jī) 上機(jī)題目2源代碼:/* c1.h (程序名) */ #include #include #include /* malloc()等 */ #include /* INT_MAX等 */ #include /* EOF(=Z或F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ /* 函數(shù)結(jié)果狀態(tài)代碼 */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ER
2、ROR 0 #define INFEASIBLE -1 /* #define OVERFLOW -2 因?yàn)樵趍ath.h中已定義OVERFLOW的值為3,故去掉此行 */ typedef int Status; /* Status是函數(shù)的類(lèi)型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */ typedef int Boolean; /* Boolean是布爾類(lèi)型,其值是TRUE或FALSE */ #define CHAR 1 /* 字符型 */ /*#define CHAR 0 /* 整型(二者選一) */ #if CHAR typedef char TElemType; TElemType Nil=
3、 ; /* 字符型以空格符為空 */ #else typedef int TElemType; TElemType Nil=0; /* 整型以0為空 */ #endif Status vi(TElemType c) #if CHAR printf(%c ,c); #else printf(%d ,c); #endif return OK; /* c6-3.h 二叉樹(shù)的二叉線(xiàn)索存儲(chǔ)表示 */ typedef enumLink,ThreadPointerTag; /* Link(0):指針,Thread(1):線(xiàn)索 */ typedef struct BiThrNode TElemType dat
4、a; struct BiThrNode *lchild,*rchild; /* 左右孩子指針 */ PointerTag LTag,RTag; /* 左右標(biāo)志 */ BiThrNode,*BiThrTree; Status CreateBiThrTree(BiThrTree *T) /* 按先序輸入二叉線(xiàn)索樹(shù)中結(jié)點(diǎn)的值,構(gòu)造二叉線(xiàn)索樹(shù)T */ /* 0(整型)/空格(字符型)表示空結(jié)點(diǎn) */ TElemType h; #if CHAR scanf(%c,&h); #else scanf(%d,&h); #endif if(h=Nil) *T=NULL; else *T=(BiThrTree)m
5、alloc(sizeof(BiThrNode); if(!*T) exit(OVERFLOW); (*T)-data=h; /* 生成根結(jié)點(diǎn)(先序) */ CreateBiThrTree(&(*T)-lchild); /* 遞歸構(gòu)造左子樹(shù) */ if(*T)-lchild) /* 有左孩子 */ (*T)-LTag=Link; CreateBiThrTree(&(*T)-rchild); /* 遞歸構(gòu)造右子樹(shù) */ if(*T)-rchild) /* 有右孩子 */ (*T)-RTag=Link; return OK; BiThrTree pre; /* 全局變量,始終指向剛剛訪(fǎng)問(wèn)過(guò)的結(jié)點(diǎn) *
6、/ void InThreading(BiThrTree p) /* 中序遍歷進(jìn)行中序線(xiàn)索化。算法6.7 */ if(p) InThreading(p-lchild); /* 遞歸左子樹(shù)線(xiàn)索化 */ if(!p-lchild) /* 沒(méi)有左孩子 */ p-LTag=Thread; /* 前驅(qū)線(xiàn)索 */ p-lchild=pre; /* 左孩子指針指向前驅(qū) */ if(!pre-rchild) /* 前驅(qū)沒(méi)有右孩子 */ pre-RTag=Thread; /* 后繼線(xiàn)索 */ pre-rchild=p; /* 前驅(qū)右孩子指針指向后繼(當(dāng)前結(jié)點(diǎn)p) */ pre=p; /* 保持pre指向p的前驅(qū)
7、 */ InThreading(p-rchild); /* 遞歸右子樹(shù)線(xiàn)索化 */ Status InOrderThreading(BiThrTree *Thrt,BiThrTree T) /* 中序遍歷二叉樹(shù)T,并將其中序線(xiàn)索化,Thrt指向頭結(jié)點(diǎn)。算法6.6 */ *Thrt=(BiThrTree)malloc(sizeof(BiThrNode); if(!*Thrt) exit(OVERFLOW); (*Thrt)-LTag=Link; /* 建頭結(jié)點(diǎn) */ (*Thrt)-RTag=Thread; (*Thrt)-rchild=*Thrt; /* 右指針回指 */ if(!T) /*
8、若二叉樹(shù)空,則左指針回指 */ (*Thrt)-lchild=*Thrt; else (*Thrt)-lchild=T; pre=*Thrt; InThreading(T); /* 中序遍歷進(jìn)行中序線(xiàn)索化 */ pre-rchild=*Thrt; pre-RTag=Thread; /* 最后一個(gè)結(jié)點(diǎn)線(xiàn)索化 */ (*Thrt)-rchild=pre; return OK; Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit)(TElemType) /* 中序遍歷二叉線(xiàn)索樹(shù)T(頭結(jié)點(diǎn))的非遞歸算法。算法6.5 */ BiThrTree p;
9、p=T-lchild; /* p指向根結(jié)點(diǎn) */ while(p!=T) /* 空樹(shù)或遍歷結(jié)束時(shí),p=T */ while(p-LTag=Link) p=p-lchild; if(!Visit(p-data) /* 訪(fǎng)問(wèn)其左子樹(shù)為空的結(jié)點(diǎn) */ return ERROR; while(p-RTag=Thread&p-rchild!=T) p=p-rchild; Visit(p-data); /* 訪(fǎng)問(wèn)后繼結(jié)點(diǎn) */ p=p-rchild; return OK; void main() BiThrTree H,T; #if CHAR printf(請(qǐng)按先序輸入二叉樹(shù)(如:ab三個(gè)空格表示a為根結(jié)
10、點(diǎn),b為左子樹(shù)的二叉樹(shù))n); #else printf(請(qǐng)按先序輸入二叉樹(shù)(如:1 2 0 0 0表示1為根結(jié)點(diǎn),2為左子樹(shù)的二叉樹(shù))n); #endif CreateBiThrTree(&T); /* 按先序產(chǎn)生二叉樹(shù) */ InOrderThreading(&H,T); /* 中序遍歷,并中序線(xiàn)索化二叉樹(shù) */ printf(中序遍歷(輸出)二叉線(xiàn)索樹(shù):n); InOrderTraverse_Thr(H,vi); /* 中序遍歷(輸出)二叉線(xiàn)索樹(shù) */ printf(n); 運(yùn)行結(jié)果:算法思想:二叉樹(shù):6-5:(以雙向線(xiàn)索鏈表為存儲(chǔ)結(jié)構(gòu)時(shí)對(duì)二叉樹(shù)進(jìn)行遍歷的算法)仿照線(xiàn)性表的存儲(chǔ)結(jié)構(gòu),在二叉樹(shù)的線(xiàn)索鏈表上添加一個(gè)頭結(jié)點(diǎn),并令其lchild域的指針指向二叉樹(shù)的根結(jié)點(diǎn),其rchild域的指針指向中序遍歷時(shí)訪(fǎng)問(wèn)的最后一個(gè)結(jié)點(diǎn);反之,令二叉樹(shù)中序序列中的第一個(gè)結(jié)點(diǎn)的lchild域指針和最后一個(gè)結(jié)點(diǎn)rchild域的指針均指向頭結(jié)點(diǎn)。這好比為二叉樹(shù)建立了一個(gè)雙向線(xiàn)索鏈表,既可從第一個(gè)結(jié)點(diǎn)起順后繼進(jìn)行遍歷,也可從最后一個(gè)結(jié)點(diǎn)起順前驅(qū)進(jìn)行遍歷。6
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋裝修物業(yè)合同
- 河北社工考試試題及答案
- 幼兒園設(shè)計(jì)數(shù)字初步應(yīng)用的小題型及答案
- 數(shù)字與實(shí)物配對(duì)的試題及答案
- 入團(tuán)面試試題及答案大全
- 新能源汽車(chē)的用戶(hù)行為模式研究試題及答案
- 心理學(xué)小學(xué)試題及答案
- 樂(lè)理考試的音高與節(jié)奏測(cè)定方法試題及答案
- 小學(xué)教師的個(gè)性化學(xué)習(xí)反思策略試題及答案
- 小學(xué)教師如何通過(guò)反思提升學(xué)生的學(xué)習(xí)動(dòng)機(jī)試題及答案
- 2024年生態(tài)環(huán)境執(zhí)法大練兵比武競(jìng)賽理論考試題庫(kù)-上(單選題)
- 東盟互聯(lián)互通總體規(guī)劃2025
- 2024-2030年中國(guó)婦科凝膠行業(yè)市場(chǎng)發(fā)展分析及前景趨勢(shì)與投資研究報(bào)告
- 中華人民共和國(guó)執(zhí)業(yè)醫(yī)師法培訓(xùn)課件
- 【高中地理人教新課標(biāo)】微專(zhuān)題四:地球的演化歷程教學(xué)設(shè)計(jì)
- 遼寧省大連市西崗區(qū) 2023-2024學(xué)年八年級(jí)下學(xué)期7月期末道德與法治試題
- 房樹(shù)人繪畫(huà)分析(附圖)
- 《團(tuán)體標(biāo)準(zhǔn) 碳纖維復(fù)合芯導(dǎo)線(xiàn)配套金具技術(shù)條件 第2部分:接續(xù)管》
- 奇異的仿生學(xué)智慧樹(shù)知到期末考試答案2024年
- 2024年度-繪本故事《井底之蛙》
評(píng)論
0/150
提交評(píng)論