版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計報告</p><p> 題 目 </p><p> 學(xué)生姓名 </p><p> 學(xué) 號 </p><p> 專業(yè)班級
2、 </p><p> 指導(dǎo)老師 </p><p> 設(shè)計日期 </p><p><b> 指導(dǎo)老師評閱意見:</b></p><p><b> 目錄</b&g
3、t;</p><p> 問題定義································
4、;······3</p><p> 可行性分析·························
5、3;·········3-4</p><p> 調(diào)試界面······················
6、183;··············4-7</p><p> 錯誤分析·················
7、·····················7</p><p> 總結(jié)···········
8、183;·····························7-8</p><p> 附錄··
9、183;····································
10、·8-14</p><p><b> 問題定義</b></p><p><b> 1.1 課題:</b></p><p> 建立二叉樹,層序、先序、中序、后序遍歷( 用遞歸或非遞歸的方法)以及中序線索化。</p><p><b> 1.2意義:</b><
11、/p><p> 通過以前的學(xué)習(xí)以及查看相關(guān)資料,按照題目要求編寫程序,進(jìn)一步加強(qiáng)對編程的訓(xùn)練,使得自己掌握一些將書本知識轉(zhuǎn)化為實際應(yīng)用當(dāng)中去,在整個程序中,主要應(yīng)用的是鏈表,但也運(yùn)用了棧。通過兩種方法解決現(xiàn)有問題。</p><p><b> 1.3要求:</b></p><p> 要求能夠輸入樹的各個結(jié)點,并能夠輸出用不同方法遍歷的遍歷序列;
12、分別建立建立二叉樹存儲結(jié)構(gòu)的的輸入函數(shù)、輸出層序遍歷序列的函數(shù)、輸出先序遍歷序列的函數(shù)、輸出中序遍歷序列的函數(shù)、輸出后序遍歷序列的函數(shù); 實現(xiàn)二叉樹的中序線索化。</p><p><b> 可行性分析</b></p><p> 2.1 創(chuàng)建二叉樹鏈表的結(jié)點存儲結(jié)構(gòu)及數(shù)據(jù)的輸入函數(shù)</p><p> 因為每個結(jié)點所存儲的數(shù)據(jù)類型為字符串,卻
13、無法使用字符串和String等數(shù)據(jù)類型,所以使用單鏈表作為結(jié)點所存儲的數(shù)據(jù)類型。以#表示空結(jié)點。</p><p> 利用先序遍歷創(chuàng)建鏈表 </p><p> 2.1.1用單鏈表s記錄輸入的數(shù)據(jù) </p><p> 2.1.2利用非遞歸調(diào)用分別生成根節(jié)點的左子樹和右子樹。</p><p> 2.1.3返回菜單重新選擇。</p>
14、;<p><b> 基本程序如下:</b></p><p> void CreatBiTree_q(BiTree &T)/</p><p><b> { </b></p><p><b> ······</b>&
15、lt;/p><p> if(ch=='#')</p><p><b> T=NULL;</b></p><p><b> else</b></p><p><b> {</b></p><p> T=(BiTree)malloc(s
16、izeof(BiTNode));</p><p><b> if(!T)</b></p><p><b> exit(0);</b></p><p> T->data=ch;</p><p> T->LTag=Link;</p><p> T->R
17、Tag=Link;</p><p> CreatBiTree_q(T->lchild);</p><p> CreatBiTree_q(T->rchild);</p><p><b> }</b></p><p><b> }</b></p><p>
18、2.2先序遍歷、中序遍歷、后序遍歷二叉鏈表。</p><p> A 、先序遍歷:訪問根節(jié)點,左子樹,右子樹的順序。</p><p> B、中序遍歷:訪問左子樹,根節(jié)點,右子樹的順序。</p><p> C、后序遍歷:訪問左子樹,右子樹,根節(jié)點的順序。</p><p> D、層次遍歷:從根結(jié)點開始,按從左至右的順序依次訪問。</p
19、><p> E、中序線索化:將二叉樹線索化,再進(jìn)行中序遍歷輸出。</p><p><b> 2.3主函數(shù)</b></p><p> a、調(diào)用生成二叉樹的函數(shù),從鍵盤輸入二叉樹的各個結(jié)點</p><p> b、分別調(diào)用先序遍歷、中序遍歷、后序遍歷二叉樹的函數(shù),輸出所有結(jié)點</p><p><
20、;b> 顯示的菜單為:</b></p><p> ***********************************************</p><p><b> 請選擇遍歷算法</b></p><p> 1.按先序輸入二叉樹序列以#表示空節(jié)點</p><p> 2.先序遍歷二叉樹遞非
21、歸算法 </p><p> 3.中序遍歷二叉樹非遞歸算法</p><p> 4.后序遍歷二叉樹非遞歸算法</p><p> 5.層次遍歷二叉樹非遞歸算法</p><p> 6.中序線索遍歷二叉樹算法</p><p> 0.按0退出"<<endl</p><p>
22、 請輸入序號(0,1,2,3,4,5,6):</p><p><b> 三、調(diào)試界面:</b></p><p> 3.1調(diào)試所用二叉樹:</p><p> A </p><p&g
23、t; B </p><p> C D </p><p> E F
24、 </p><p> G </p><p> 輸入的二叉樹是:ABC##DE#F##G###(#代表空結(jié)點)</p><p
25、> 輸出的遍歷應(yīng)該是:先序遍歷:A B C D E F G</p><p> 中序遍歷:C B E F D G A</p><p> 后序遍歷:C B G E F D A</p><p> 層序遍歷:A B C D E F G </p><p> 中序線索化遍歷:C B E F D G A</p><p&g
26、t; 3.2程序運(yùn)行如下:</p><p><b> 1、菜單界面:</b></p><p><b> 2、創(chuàng)建界面:</b></p><p> 3、先序非遍歷二叉樹:</p><p> 4、中序非遍歷二叉樹:</p><p> 5、后序非遍歷二叉樹:</p
27、><p> 6、層次遍歷二叉樹:</p><p> 7、中序線索化,中序遍歷:</p><p><b> 四、錯誤分析:</b></p><p> 1、中序線索化后,先序、中序、后序、層次遍歷均出現(xiàn)錯誤,陷入死循環(huán),</p><p> 改正:另外編寫一個創(chuàng)建二叉樹的函數(shù),中序線索化另外重新創(chuàng)
28、建,中序輸出函數(shù)也另外編寫</p><p> 2、中序線索化時,用到的線索在結(jié)構(gòu)體內(nèi)定義,在線索化時,顯示為未定義</p><p> 改正:直接在外部定義線索#define Link 0 和#define Thread 1</p><p><b> 五、總結(jié)</b></p><p> 實驗開始時定義結(jié)構(gòu)時,比細(xì)心
29、,總會有或多或少的問題出現(xiàn),如數(shù)據(jù)域和指針域定義的類型不一樣,在實驗過程中總有這樣或那樣的問題,在本次實驗中,二叉樹的先序,中序,后序遍歷都是采用非遞歸調(diào)用,用起來稍微復(fù)雜,這使我更進(jìn)一步學(xué)習(xí)和理解了樹的遍歷,更靈活地運(yùn)用了指針與數(shù)組。</p><p><b> 附錄</b></p><p><b> 6.1源程序</b></p>
30、<p> #include <iostream.h></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <malloc.h> </p><p> #define Link
31、0</p><p> #define Thread 1</p><p> int right=0;</p><p> typedef char TElemType;</p><p> typedef struct BiTNode</p><p><b> {</b></p>
32、<p> TElemType data;</p><p> struct BiTNode *lchild,*rchild; </p><p> int LTag, RTag,flag;</p><p> }BiTNode,*BiTree;</p><p> BiTree pre;</p><p>
33、 void CreatBiTree_q(BiTree &T)</p><p><b> {</b></p><p> TElemType ch;</p><p> scanf("%c",&ch);</p><p> if(ch=='#')</p>
34、<p><b> T=NULL;</b></p><p><b> else</b></p><p><b> {</b></p><p> T=(BiTree)malloc(sizeof(BiTNode));</p><p><b> if(!
35、T)</b></p><p><b> exit(0);</b></p><p> T->data=ch;</p><p> T->LTag=Link;</p><p> T->RTag=Link;</p><p> CreatBiTree_q(T->
36、lchild);</p><p> CreatBiTree_q(T->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> void CreateBiTree(BiTree *T)</p><p><
37、;b> { </b></p><p> TElemType ch;</p><p> scanf("%c",&ch);</p><p> if(ch=='#')</p><p><b> *T=NULL;</b></p><p&g
38、t;<b> else</b></p><p><b> {</b></p><p> *T=(BiTree)malloc(sizeof(BiTNode));</p><p> if(!*T) exit(-1);</p><p> (*T)->data=ch;</p>
39、<p> CreateBiTree(&(*T)->lchild);</p><p> CreateBiTree(&(*T)->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> void P
40、reOrderTraverse(BiTree &T)</p><p><b> {</b></p><p> BiTree p,S[20];</p><p> int top=-1;</p><p> p=T; </p><p><b> do<
41、;/b></p><p><b> {</b></p><p> while(p!= NULL) </p><p><b> {</b></p><p> cout << p->data<<" ";</p><p&g
42、t;<b> top++;</b></p><p> S[top]=p; </p><p> p=p->lchild;</p><p><b> }</b></p><p> if( top >-1 )</p><p><b> {</
43、b></p><p> p=S[top]; </p><p><b> top--; </b></p><p> p = p->rchild; </p><p><b> }</b></p><p> }while (( p != NULL ) ||(t
44、op>-1));</p><p><b> }</b></p><p> int inorderTraverse(BiTree &T)</p><p><b> {</b></p><p> BiTree p,s[20];int i=-1;</p><p&g
45、t;<b> p=T;</b></p><p> while(p||i>-1)</p><p><b> {</b></p><p><b> if(p)</b></p><p><b> {</b></p><p>
46、;<b> i++;</b></p><p><b> s[i]=p;</b></p><p> p=p->lchild;</p><p><b> }</b></p><p><b> else</b></p><p
47、><b> {</b></p><p><b> p=s[i];</b></p><p> cout<<" ";</p><p> cout<<p->data;</p><p><b> i--;</b><
48、/p><p> p=p->rchild;</p><p><b> }</b></p><p> }return 0;</p><p><b> }</b></p><p> void postorder (BiTree T){</p><p&
49、gt; int s2[20],top=0;</p><p> BiTree p,s1[20];</p><p><b> p=T;</b></p><p><b> do {</b></p><p> while (p!=NULL)</p><p><b>
50、; {</b></p><p> s1[top]=p; s2[top++]=0; </p><p> p=p->lchild;</p><p><b> } </b></p><p> while(top && s2[top-1]==1)</p><
51、p><b> {</b></p><p><b> top--;</b></p><p> p=s1[top]; </p><p> cout<<" ";</p><p> cout<<p->data; </p><
52、;p><b> } </b></p><p> if(top>0) </p><p><b> { </b></p><p> s2[top-1]=1;</p><p> p=s1[top-1]->rchild; </p><p><b&g
53、t; }</b></p><p> }while (top>0); </p><p><b> }</b></p><p> void LevelOrder(BiTree &b)</p><p><b> {</b></p><p> B
54、iTree qu[20];</p><p> int front,rear;</p><p> front=rear=-1;</p><p><b> rear++;</b></p><p> qu[rear]=b;</p><p> while(front!=rear)</p&g
55、t;<p><b> {</b></p><p> front=(front+1)%20;</p><p> b=qu[front];</p><p> printf(" %c ",b->data);</p><p> if(b->lchild!=NULL)<
56、/p><p><b> {</b></p><p> rear=(rear+1)%20;</p><p> qu[rear]=b->lchild;</p><p><b> } </b></p><p> if(b->rchild!=NULL)</
57、p><p><b> {</b></p><p> rear=(rear+1)%20;</p><p> qu[rear]=b->rchild;</p><p><b> } </b></p><p><b> } </b>&l
58、t;/p><p><b> }</b></p><p> void InThreading(BiTree p)</p><p><b> {</b></p><p><b> if(p)</b></p><p><b> {</b&
59、gt;</p><p> InThreading(p->lchild);</p><p> if(!p->lchild)//前驅(qū)線索</p><p><b> {</b></p><p> p->LTag=Thread;</p><p> p->lchild=pr
60、e;</p><p><b> }</b></p><p> if(!pre->rchild)//后繼線索</p><p><b> {</b></p><p> pre->RTag=Thread;</p><p> pre->rchild=p;&
61、lt;/p><p><b> }</b></p><p><b> pre=p;</b></p><p> InThreading(p->rchild);</p><p><b> }</b></p><p><b> }</
62、b></p><p> void InOrderThreading(BiTree *Thrt,BiTree T)</p><p><b> {</b></p><p> if(!((*Thrt)=(BiTree)malloc(sizeof(BiTNode))))</p><p><b> exit
63、(0);</b></p><p> (*Thrt)->LTag=Link;</p><p> (*Thrt)->RTag=Thread;</p><p> (*Thrt)->rchild=(*Thrt);</p><p><b> if(!T)</b></p><
64、p> (*Thrt)->lchild=(*Thrt);</p><p><b> else</b></p><p><b> {</b></p><p> (*Thrt)->lchild=T;</p><p> pre=(*Thrt);</p><p&
65、gt; InThreading(T);</p><p> pre->rchild=(*Thrt);</p><p> pre->RTag=Thread;</p><p> (*Thrt)->rchild=pre;</p><p><b> }</b></p><p>&
66、lt;b> }</b></p><p> void InorderTraverse_Thr(BiTree &T)</p><p><b> {</b></p><p><b> BiTree p;</b></p><p> p=T->lchild;</
67、p><p> while(p!=T)p=T</p><p><b> {</b></p><p> while(p->LTag==Link)</p><p> p=p->lchild;</p><p> cout<<p->data;</p><
68、;p> while(p->RTag==Thread&&p->rchild!=T)</p><p><b> {</b></p><p> p=p->rchild;</p><p> cout<<" ";</p><p> cout<&
69、lt;p->data;</p><p><b> }</b></p><p> p=p->rchild;</p><p><b> }</b></p><p><b> }</b></p><p> int main()</p
70、><p><b> {</b></p><p> BiTree T,t;</p><p><b> int e;</b></p><p> while(e!=0)</p><p><b> {</b></p><p>
71、cout<<endl<<"請選擇遍歷算法:"<<endl;</p><p> cout<<"1.按先序輸入二叉樹序列以#表示空節(jié)點 "<<endl;</p><p> cout<<"2.先序遍歷二叉樹遞歸算法:"<<endl; </p&g
72、t;<p> cout<< "3.中序遍歷二叉樹遞歸算法:"<<endl;</p><p> cout<<"4.后序遍歷二叉樹遞歸算法: "<<endl;</p><p> cout<<"5.層次遍歷二叉樹遞歸算法"<<endl;</
73、p><p> cout<<"6.中序線索遍歷二叉樹算法"<<endl;</p><p> cout<<"0.按0退出"<<endl;</p><p> cout<<"請輸入序號(0,1,2,3,4,5,6):"<<endl;</
74、p><p><b> cin>>e;</b></p><p> cout<<endl;</p><p><b> if(e==1)</b></p><p><b> { </b></p><p> cout <&l
75、t;"按先序輸入二叉樹序列以#表示空節(jié)點: "<<endl;</p><p> CreateBiTree(&T);</p><p> cout<<endl;</p><p><b> }</b></p><p><b> if(e==2)</b&
76、gt;</p><p><b> {</b></p><p> cout << "先序遍歷遞歸算法是: "<<endl;;</p><p> PreOrderTraverse(T);</p><p> cout<<endl;</p><
77、p><b> }</b></p><p> if(e==3) </p><p><b> { </b></p><p> cout<< "中序遍歷遞歸算法是: "<<endl;;</p><p> inorderTraverse
78、(T);</p><p> cout<<endl;</p><p><b> }</b></p><p><b> if(e==4)</b></p><p><b> {</b></p><p> cout<<"
79、;后序遍歷的非遞歸算法是: "<<endl;</p><p> postorder (T);</p><p> cout<<endl;</p><p><b> }</b></p><p><b> if(e==5)</b></p><
80、;p><b> { </b></p><p> printf("\n層次遍歷二叉樹:\n");</p><p> LevelOrder(T);</p><p><b> }</b></p><p><b> if(e==6)</b></
81、p><p><b> {</b></p><p> cout <<"按先序輸入二叉樹序列以#表示空節(jié)點: "<<endl;</p><p> CreatBiTree_q(T);</p><p> cout<<endl;</p><p>
82、 printf("中序線索化二叉樹:\n");</p><p> InOrderThreading(&t,T);</p><p> printf("線索化工作已經(jīng)完成!中序遍歷二叉樹\n");</p><p> InorderTraverse_Thr(t);</p><p> print
83、f("\n");</p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p>&
84、lt;b> 6.2 參考資料</b></p><p> 【1】嚴(yán)蔚敏、吳偉民主編 《數(shù)據(jù)結(jié)構(gòu)》(C語言版) 清華大學(xué)出版社 2002【2】殷人昆等著 《數(shù)據(jù)結(jié)構(gòu)》(C++版) 清華大學(xué)出版社 2001【3】 金遠(yuǎn)平著 《數(shù)據(jù)結(jié)構(gòu)》(C++描述) 清華大學(xué)出版社 2005【4】許卓群等著 《數(shù)據(jù)結(jié)構(gòu)與
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--按層次遍歷二叉樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉樹的遍歷算法集成
- 二叉樹數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---線索二叉樹的生成及其遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹的遍歷算法分析與設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉樹和中序遍歷的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉樹的建立和遍歷的演示
- 遍歷二叉樹課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----二叉樹的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---計算二叉樹高度
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉樹的操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹及應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---線索二叉樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹的相關(guān)操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--二叉樹的算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----二叉樹平衡的判定
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-二叉樹的基本操作
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計--二叉排序樹調(diào)整為平衡二叉樹
評論
0/150
提交評論