版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 學(xué)年論文(設(shè)計(jì))</b></p><p><b> ?。ū究疲?lt;/b></p><p> 學(xué) 院 </p><p> 專 業(yè) </p><p> 年 級
2、 </p><p> 姓 名 </p><p> 論文(設(shè)計(jì))題目 </p><p> 指導(dǎo)教師 職稱 </p><p> 成 績
3、 </p><p> 2012 年 月 日</p><p><b> 摘要:</b></p><p> 數(shù)據(jù)結(jié)構(gòu)是一門研究非數(shù)值計(jì)算的程序設(shè)計(jì)問題中計(jì)算機(jī)的操作對象以及它們之間的關(guān)系和操作的學(xué)科。作為研究對象的數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)中的表示(又稱映像),稱為數(shù)據(jù)的
4、物理結(jié)構(gòu),又稱存儲(chǔ)結(jié)構(gòu)。相同的邏輯結(jié)構(gòu)可以具有不同的存儲(chǔ)結(jié)構(gòu),因而有不同的算法。</p><p> 本次課程設(shè)計(jì),程序中的數(shù)據(jù)采用“樹形結(jié)構(gòu)”作為其數(shù)據(jù)結(jié)構(gòu)。具體采用的是二叉樹。二叉樹是樹形結(jié)構(gòu)的一個(gè)重要的類型,二叉樹是n(n>0)個(gè)結(jié)點(diǎn)的有限集,它或者是空集(n>0),或者由一個(gè)根結(jié)點(diǎn)以及兩棵互不相交的,分別稱為左子樹和右子樹的二叉樹組成。</p><p> 二叉樹的順序
5、存儲(chǔ)結(jié)構(gòu)是把二叉樹所有結(jié)點(diǎn),按照一定的次序排序,存儲(chǔ)到一片連續(xù)的存儲(chǔ)單元中。但二叉樹的順序存儲(chǔ)結(jié)構(gòu)浪費(fèi)空間并且插入、刪除不方便。二叉樹的鏈?zhǔn)酱鎯?chǔ)每個(gè)結(jié)點(diǎn)至少包含三個(gè)域:數(shù)據(jù)域、左指針域、右指針域,不浪費(fèi)空間。二叉樹的存儲(chǔ)結(jié)構(gòu)和算法比較簡單,特別適合計(jì)算機(jī)處理,即使一般形式的樹也可簡單的轉(zhuǎn)換為二叉樹。</p><p> 現(xiàn)實(shí)中經(jīng)常用到二叉樹,因此本課程設(shè)計(jì)主要實(shí)現(xiàn)了二叉樹的建立、三種遍歷,計(jì)算二叉數(shù)的樹深、統(tǒng)計(jì)葉
6、子結(jié)點(diǎn)的個(gè)數(shù)等功能。</p><p> 關(guān)鍵詞:二叉樹;遍歷;樹深;葉子結(jié)點(diǎn)</p><p><b> 學(xué)生簽名: </b></p><p> 2012年 月 日</p><p><b> 目錄</b></p><p><b> 一、需求分析
7、4</b></p><p><b> 二、概要設(shè)計(jì)5</b></p><p><b> 三、詳細(xì)設(shè)計(jì)6</b></p><p> 四、調(diào)試分析及測試12</p><p> 五、課程設(shè)計(jì)總結(jié)20</p><p><b> 參考文獻(xiàn)21
8、</b></p><p><b> 附錄21</b></p><p><b> 二叉樹基本操作</b></p><p><b> 需求分析</b></p><p> 二叉樹形象地說即樹中每個(gè)節(jié)點(diǎn)最多只有兩個(gè)分支,它是一種重要的數(shù)據(jù)類型。可以運(yùn)用于建立家譜,
9、公司所有的員工的職位圖,以及各種事物的分類和各種機(jī)構(gòu)的職位圖表等。</p><p> 二叉樹是通過建立一個(gè)鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),達(dá)到能夠?qū)崿F(xiàn)前序遍歷,中序遍歷,后序遍歷。以及能夠從輸入的數(shù)據(jù)中得知二叉樹的葉子結(jié)點(diǎn)的個(gè)數(shù),二叉樹的深度。在此,二叉樹的每一個(gè)結(jié)點(diǎn)中必須包括:值域,左指針域,右指針域。演示程序以用戶與計(jì)算機(jī)對話的方式進(jìn)行,即在計(jì)算機(jī)終端上顯示提示信息后,由用戶在鍵盤上輸入相應(yīng)動(dòng)作的序號和相應(yīng)的輸入數(shù)據(jù)。<
10、;/p><p><b> 1.1 選題理由</b></p><p> 根據(jù)自己的知識功底和能力水平擇選了二叉樹問題. 而且隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,越來越多的問題正逐漸改用計(jì)算機(jī)解答,并且有些技術(shù)已經(jīng)非常成熟。運(yùn)用所學(xué)計(jì)算機(jī)知識來研究二叉樹的有關(guān)內(nèi)容可以鍛煉和提高我編程 和獨(dú)立解決問題的能力,還可以使我增強(qiáng)信心,為我以后的編程開個(gè)好頭,故我選擇了這個(gè)課題。</p
11、><p> 1.2課程設(shè)計(jì)任務(wù)及要求</p><p> (1)按先序次序輸入二叉樹中結(jié)點(diǎn)的值,構(gòu)造二叉鏈表表示的二叉樹t;</p><p> (2)對二叉樹t作先序、中序、后序遍歷的遞歸算法,輸出結(jié)果;</p><p> (3)計(jì)算二叉樹t的深度,輸出結(jié)果;</p><p> (4)計(jì)算二叉樹t的葉子結(jié)點(diǎn)個(gè)數(shù)&l
12、t;/p><p><b> 1.3課程設(shè)計(jì)思想</b></p><p> 本次課程設(shè)計(jì)中,用到的主要知識就是遞歸思想,著重體會(huì)遞歸的思想。建立二叉樹采用先序次序插入的方式。對二叉樹進(jìn)行遍歷時(shí)采用遞歸函數(shù)的方式。求二叉樹的深度及葉子結(jié)點(diǎn)個(gè)數(shù)均采用遞歸方式。 </p><p> 1.4軟硬件運(yùn)行環(huán)境及開發(fā)工具</p><p&g
13、t; WindowsXP操作系統(tǒng)、Microsoft Visual C++ 6.0</p><p><b> 概要設(shè)計(jì)</b></p><p> 2.1對程序中定義的核心數(shù)據(jù)結(jié)構(gòu)及對其說明:</p><p> typedef struct BiTNode</p><p><b> { </
14、b></p><p> char data;</p><p> struct BiTNode *lchild,*rchild;</p><p> }BiTNode,*BiTree;</p><p> 在開頭定義了二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),此處采用了每個(gè)結(jié)點(diǎn)中設(shè)置三個(gè)域, 即值域,左指針域和右指針域。</p><p
15、> 2.2 程序模塊及其功能:</p><p> 本程序分為:7大模塊。二叉樹的建立鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)、前序遍歷、中序遍歷、后序遍歷、求葉子結(jié)點(diǎn)的個(gè)數(shù)計(jì)算、中序遍歷、后序遍歷、深度、主函數(shù)。</p><p> 1、二叉樹的建立鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu);首先typedef struct BiTNode:定義二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),此處采用了每個(gè)結(jié)點(diǎn)中設(shè)置三個(gè)域,data:即值域,*lchild:左指
16、針域和rchild:右指針域。</p><p> 2、二叉樹的前序遍歷;利用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)的前序遍歷:先訪問根結(jié)點(diǎn),再依次訪問左右子樹。</p><p> 3、二叉樹的中序遍歷;利用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)的中序遍歷:先訪問左子數(shù),再訪問根結(jié)點(diǎn),最后訪問右子樹。</p><p> 4、二叉樹的后序遍歷;利用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)的前序遍歷:先訪問左右子樹,再訪
17、問根結(jié)點(diǎn)。</p><p> 5、求二叉樹的深度:首先判斷二叉樹是否為空,若為空則此二叉樹的深度為0。否則,就先別求出左右子樹的深度并進(jìn)行比較,取較大的+1就為二叉樹的深度。</p><p> 6、二叉樹的求葉子結(jié)點(diǎn)的個(gè)數(shù)計(jì)算;先分別求得左右子樹中各葉子結(jié)點(diǎn)個(gè)數(shù),再計(jì)算出兩者之和即為二叉樹的葉子結(jié)點(diǎn)數(shù)。</p><p> 7、主函數(shù)。主函數(shù)中分別調(diào)用各函數(shù)。&
18、lt;/p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p> 1、存儲(chǔ)結(jié)構(gòu)的建立由遞歸函數(shù)實(shí)現(xiàn)</p><p><b> 具體函數(shù)為:</b></p><p> typedef struct bitnode</p><p><b> {</b>
19、</p><p> telemtype data;</p><p> struct bitnode *lchild,*rchild;</p><p> }bitnode ,*bitree;</p><p> bitree createbitree(bitree t)</p><p><b> {&l
20、t;/b></p><p><b> char ch;</b></p><p> scanf("%c",&ch);</p><p> if(ch=='#') t=NULL;</p><p><b> else</b></p>&
21、lt;p><b> {</b></p><p> if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p> t->data=ch;</p><p> t->lchild=createbitree(t->lchild);</p&g
22、t;<p> t->rchild=createbitree(t->rchild);</p><p><b> }</b></p><p><b> return t;</b></p><p><b> }</b></p><p> 在創(chuàng)建的二
23、叉樹中,左右孩子都為字符型。</p><p> char的作用是輸入n個(gè)任意的字符,而且在輸入n個(gè)字符后,必須輸入n+1個(gè)'#',才能得到本程序所有能夠?qū)崿F(xiàn)的功能。t=Null是將二叉樹置空。</p><p> if(!(t=(bitnode *)malloc(sizeof(bitnode)))),采用動(dòng)態(tài)申請新結(jié)點(diǎn)的方式,不僅實(shí)現(xiàn)起來方便,而且還節(jié)省大量的存儲(chǔ)空間。&
24、lt;/p><p> t->data=ch;值域</p><p> t->lchild=createbitree(t->lchild);</p><p> t->rchild=createbitree(t->rchild);</p><p> 將二叉樹中的每一個(gè)結(jié)點(diǎn)設(shè)置為:值域,左指針域,右指針。</p
25、><p> 這一小段程序?qū)崿F(xiàn)了二叉樹的置空,二叉樹的建立,二叉樹的存儲(chǔ)。</p><p> 2、前序遍歷:先訪問根結(jié)點(diǎn),再訪問左子樹,最后訪問右子樹。</p><p><b> 具體函數(shù)為:</b></p><p> void preordertraverse(bitree t)</p><p&g
26、t;<b> {</b></p><p><b> if(t)</b></p><p><b> {</b></p><p> printf("%c",t->data);</p><p> preordertraverse(t->lch
27、ild);</p><p> preordertraverse(t->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> 3、中序遍歷:先訪問左子樹,再訪問根結(jié)點(diǎn),最后訪問右子樹。</p><p>&l
28、t;b> 具體函數(shù)為:</b></p><p> void inordertraverse(bitree t)</p><p><b> {</b></p><p><b> if (t)</b></p><p><b> {</b></p&g
29、t;<p> inordertraverse(t->lchild);</p><p> printf("%c",t->data);</p><p> inordertraverse(t->rchild);</p><p><b> }</b></p><p>&
30、lt;b> }</b></p><p> 4、后序遍歷:先訪問左子樹,再訪問右子樹,最后訪問根結(jié)點(diǎn)。</p><p><b> 具體函數(shù)為:</b></p><p> void postordertraverse(bitree t)</p><p><b> {</b>&
31、lt;/p><p><b> if(t)</b></p><p><b> {</b></p><p> postordertraverse(t->lchild);</p><p> postordertraverse(t->rchild);</p><p>
32、 printf("%c",t->data);</p><p><b> }</b></p><p><b> }</b></p><p> 5、求二叉樹的深度:</p><p> 先定義三個(gè)整形變量m,n.如果樹為空,則height=0;</p>&
33、lt;p> 否則,先分別訪問出左右子樹的深度,再進(jìn)行比較,將較大的+1的結(jié)果就是所求二叉樹的深度。</p><p><b> 具體函數(shù)為:</b></p><p> int height(bitree t)</p><p><b> {</b></p><p><b> i
34、nt m,n;</b></p><p> if(t==NULL) return 0;</p><p><b> else </b></p><p><b> {</b></p><p> m=height(t->lchild);</p><p>
35、n=height(t->rchild);</p><p> return (m>n)?m+1:n+1;</p><p><b> }</b></p><p><b> }</b></p><p> 6、求葉子結(jié)點(diǎn)的個(gè)數(shù):</p><p> 用leafco
36、unt變量表示葉子結(jié)點(diǎn)的總個(gè)數(shù),用leafcount(t->lchild)、leafcount(t->rchild)分別表示訪問的左右子樹中葉子結(jié)點(diǎn)的個(gè)數(shù)。</p><p> 當(dāng)樹為空是此時(shí)討論葉子結(jié)點(diǎn)個(gè)數(shù)無意義;</p><p><b> 當(dāng)樹非空時(shí)分為:</b></p><p> 一、左右子數(shù)都不存在時(shí),即葉子結(jié)點(diǎn)的個(gè)數(shù)為
37、1;</p><p> 二、左右子樹存在,就用分別訪問出左右子樹中葉子結(jié)點(diǎn)的個(gè)數(shù),兩者相加就為二叉樹葉子結(jié)點(diǎn)的個(gè)數(shù)。</p><p><b> 具體函數(shù)為:</b></p><p> int leafcount(bitree t)</p><p><b> {</b></p>
38、<p> if(!t) return 0; //空數(shù)無葉子</p><p> else if(!t->lchild&&!t->rchild) return 1;</p><p> else return leafcount(t->lchild)+leafcount(t->rchild);</p><p>
39、<b> }</b></p><p><b> 7、主函數(shù):</b></p><p> 包括:二叉樹的數(shù)據(jù)結(jié)構(gòu)bitree t、函數(shù)createbitree、height、leafcount、前序遍歷preordertraverse、中序遍歷inordertraverse、后序遍歷postordertraverse。</p>
40、<p><b> 具體函數(shù)為:</b></p><p> void main()</p><p><b> {</b></p><p><b> bitree t;</b></p><p><b> int w,v;</b></p
41、><p> printf("請輸入建樹字符序列:");</p><p> t=createbitree(t);</p><p> printf("先續(xù)遍歷的結(jié)果是:");</p><p> preordertraverse(t);</p><p> printf("
42、;\n");</p><p> printf("中續(xù)遍歷的結(jié)果是:");</p><p> inordertraverse(t);</p><p> printf("\n");</p><p> printf("后續(xù)遍歷的結(jié)果是:");</p><
43、;p> postordertraverse(t);</p><p> printf("\n");</p><p> printf("二叉樹的深度是:");</p><p> w=height(t);</p><p> printf("%d\n",w);</p&g
44、t;<p> printf("二叉樹的葉子結(jié)點(diǎn)的數(shù)目為:");</p><p> v=leafcount(t);</p><p> printf("%d",v);</p><p> printf("\n");</p><p><b> }</b
45、></p><p><b> 8、完整代碼:</b></p><p> #include <stdio.h></p><p> #include <malloc.h></p><p> #include <process.h></p><p>
46、#define ok 1</p><p> #define error 0</p><p> #define overflow -1</p><p> typedef char telemtype;</p><p> typedef struct bitnode</p><p><b> {<
47、/b></p><p> telemtype data;</p><p> struct bitnode *lchild,*rchild;</p><p> }bitnode ,*bitree;</p><p> bitree createbitree(bitree t)</p><p><b>
48、; {</b></p><p><b> char ch;</b></p><p> scanf("%c",&ch);</p><p> if(ch=='#') t=NULL;</p><p><b> else</b></p&
49、gt;<p><b> {</b></p><p> if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p> t->data=ch;</p><p> t->lchild=createbitree(t->lchild);&l
50、t;/p><p> t->rchild=createbitree(t->rchild);</p><p><b> }</b></p><p><b> return t;</b></p><p><b> }</b></p><p>
51、 void preordertraverse(bitree t)</p><p><b> {</b></p><p><b> if(t)</b></p><p><b> {</b></p><p> printf("%c",t->data
52、);</p><p> preordertraverse(t->lchild);</p><p> preordertraverse(t->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> v
53、oid inordertraverse(bitree t)</p><p><b> {</b></p><p><b> if (t)</b></p><p><b> {</b></p><p> inordertraverse(t->lchild);<
54、/p><p> printf("%c",t->data);</p><p> inordertraverse(t->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> void
55、postordertraverse(bitree t)</p><p><b> {</b></p><p><b> if(t)</b></p><p><b> {</b></p><p> postordertraverse(t->lchild);</
56、p><p> postordertraverse(t->rchild);</p><p> printf("%c",t->data);</p><p><b> }</b></p><p><b> }</b></p><p> int
57、height(bitree t)</p><p><b> {</b></p><p><b> int m,n;</b></p><p> if(t==NULL) return 0;</p><p><b> else </b></p><p>
58、;<b> {</b></p><p> m=height(t->lchild);</p><p> n=height(t->rchild);</p><p> return (m>n)?m+1:n+1;</p><p><b> }</b></p><
59、;p><b> }</b></p><p> int leafcount(bitree t)</p><p><b> {</b></p><p> if(!t) return 0; //空數(shù)無葉子</p><p> else if(!t->lchild&&
60、!t->rchild) return 1;</p><p> else return leafcount(t->lchild)+leafcount(t->rchild);</p><p><b> }</b></p><p> void main()</p><p><b> {&l
61、t;/b></p><p><b> bitree t;</b></p><p><b> int w,v;</b></p><p> printf("請輸入建樹字符序列:");</p><p> t=createbitree(t);</p><
62、p> printf("先續(xù)遍歷的結(jié)果是:");</p><p> preordertraverse(t);</p><p> printf("\n");</p><p> printf("中續(xù)遍歷的結(jié)果是:");</p><p> inordertraverse(t)
63、;</p><p> printf("\n");</p><p> printf("后續(xù)遍歷的結(jié)果是:");</p><p> postordertraverse(t);</p><p> printf("\n");</p><p> printf(
64、"二叉樹的深度是:");</p><p> w=height(t);</p><p> printf("%d\n",w);</p><p> printf("二叉樹的葉子結(jié)點(diǎn)的數(shù)目為:");</p><p> v=leafcount(t);</p><p&
65、gt; printf("%d",v);</p><p> printf("\n");</p><p><b> }</b></p><p><b> 調(diào)試分析及測試</b></p><p> 4.1 遇到的問題及解決方法</p><
66、;p> (1). 二叉樹是另一種樹形結(jié)構(gòu),作為一種數(shù)據(jù)結(jié)構(gòu)其在計(jì)算機(jī)中的存儲(chǔ)結(jié)構(gòu)有兩種:順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。編寫代碼之前首先要確定采用的存儲(chǔ)方式。經(jīng)分析及查找參考資料決定采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),這種存儲(chǔ)結(jié)構(gòu)不浪費(fèi)空間并且插入、刪除方便。</p><p> (2).本程序演示程序以用戶與計(jì)算機(jī)對話的方式進(jìn)行,即在計(jì)算機(jī)終端上顯示提示信息后,由用戶在鍵盤上輸入相應(yīng)動(dòng)作的序號和相應(yīng)的輸入數(shù)據(jù)。在運(yùn)行程序的過
67、程中出現(xiàn)錯(cuò)誤,出現(xiàn)了以下界面:</p><p> 后經(jīng)仔細(xì)分析及查看代碼,發(fā)現(xiàn)scanf("%c",&ch)語句中少了一個(gè)‘&’,經(jīng)改正后,再次運(yùn)行,得到結(jié)果。</p><p> 4.2 算法的時(shí)空分析</p><p> 遍歷二叉樹的基本操作是訪問結(jié)點(diǎn),則不論按哪一種次序進(jìn)行遍歷,對含n個(gè)結(jié)點(diǎn)的二叉樹,時(shí)間復(fù)雜度均為O(n)
68、。所需輔助空間為遍歷過程中棧的最大容量,即樹的深度,在最差情況下為n,則空間復(fù)雜度也為O(n)。</p><p> 4.3 程序模塊構(gòu)架</p><p> 本程序模塊劃分比較合理,易觀察且操作方便。整體可以分成七個(gè)模塊,分別為建立二叉樹、前序遍歷、中序遍歷、后序遍歷、求葉子結(jié)點(diǎn)的個(gè)數(shù)、求二叉樹的深度、主函數(shù)。</p><p><b> 4.4 算法的
69、改進(jìn)</b></p><p> 這道題可以用非遞歸也可以用遞歸的方法來編寫前序遍歷、中序遍歷、后序遍歷、求葉子結(jié)點(diǎn)的個(gè)數(shù)、求二叉樹深度的算法,這里我用了后者,遞歸算法簡單方便。</p><p> 4.5 程序使用說明</p><p> (1) 本程序的運(yùn)行環(huán)境為WindowsXP操作系統(tǒng)</p><p> ?。?) 用戶界面
70、為Microsoft Visual C++ 6.0</p><p> ?。?) 進(jìn)入界面后,首先進(jìn)行代碼的輸入,然后通過編譯、組建、執(zhí)行,得到運(yùn)行結(jié)果,并進(jìn)行分析查看運(yùn)行結(jié)果是否正確,進(jìn)而確定是否要調(diào)試程序</p><p><b> 4.6 測試結(jié)果</b></p><p><b> 4.7 其他程序</b></
71、p><p> (1) 遍歷二叉樹的另一種遞歸算法(以先序遍歷為例)</p><p> #include <stdio.h></p><p> #include <malloc.h></p><p> #include <process.h></p><p> #define
72、ok 1</p><p> #define error 0</p><p> #define overflow -1</p><p> typedef char status;</p><p> typedef char TElemtype;</p><p> typedef st
73、ruct BiTNode</p><p><b> {</b></p><p> TElemtype data;</p><p> struct BiTNode *lchild,*rchild;</p><p> }BiTNode,*BiTree;</p><p> sta
74、tus CreateBiTree(BiTree &T)</p><p> { //按先序次序輸入二叉樹中結(jié)點(diǎn)的值(一個(gè)字符),'#'字符表示空樹,</p><p> //構(gòu)造二叉鏈表表示的二叉樹T</p><p><b> char ch;</b></p><p> scanf(&qu
75、ot;%c",&ch);</p><p> if (ch=='#') T=NULL;</p><p><b> else </b></p><p><b> {</b></p><p> if(!(T=(BiTNode *)malloc(sizeof(BiT
76、Node)))) </p><p> exit (overflow);</p><p> T->data=ch; //生成根結(jié)點(diǎn)</p><p> CreateBiTree(T->lchild); //構(gòu)造左子數(shù)</p><p> CreateBiTree(T->rchi
77、ld); //構(gòu)造右子數(shù)</p><p><b> }</b></p><p> return ok;</p><p><b> }</b></p><p> status PreorderTraverse(BiTree T,status(*visit)(TElemtype e))&l
78、t;/p><p> { //采用二叉鏈表存儲(chǔ)結(jié)構(gòu),visit是對數(shù)據(jù)元素操作的應(yīng)用函數(shù),</p><p> //先序遍歷二叉樹T的遞歸算法,對每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit</p><p><b> if (T)</b></p><p><b> {</b></p><p
79、> if(visit(T->data))</p><p> if(PreorderTraverse(T->lchild,visit))</p><p> if(PreorderTraverse(T->rchild,visit)) return ok;</p><p> return error;</p><p>
80、;<b> }</b></p><p> else return ok;</p><p><b> }</b></p><p> status printelement(TElemtype e)</p><p><b> {</b></p><p
81、> printf("%c",e);</p><p> return ok;</p><p><b> }</b></p><p> void main ()</p><p><b> { </b></p><p><b> Bi
82、Tree T;</b></p><p> CreateBiTree(T);</p><p> PreorderTraverse(T,printelement);</p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果為</b></p><p&
83、gt; ?。?) 求二叉樹中以元素值為x的結(jié)點(diǎn)為根的子樹的深度</p><p> #include <stdio.h></p><p> #include <malloc.h></p><p> #include <process.h></p><p> #define ok 1</p>
84、;<p> #define error 0</p><p> #define overflow -1</p><p> typedef char status;</p><p> typedef char telemtype;</p><p> typedef struct bitnode</p>
85、<p><b> {</b></p><p> telemtype data;</p><p> struct bitnode *lchild,*rchild;</p><p> }bitnode,*bitree;</p><p> status createbitree(bitree &am
86、p;t)</p><p><b> {</b></p><p><b> char ch;</b></p><p> scanf("%c",&ch);</p><p> if(ch=='#') t=NULL;</p><p&g
87、t;<b> else</b></p><p><b> {</b></p><p> if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p> t->data=ch;</p><p> createb
88、itree(t->lchild);</p><p> createbitree(t->rchild);</p><p><b> }</b></p><p> return ok;</p><p><b> }</b></p><p> int getd
89、epth(bitree t)</p><p><b> {</b></p><p><b> int m,n;</b></p><p><b> if(t)</b></p><p><b> {</b></p><p>
90、m=getdepth(t->lchild);</p><p> n=getdepth(t->rchild);</p><p> return m>=n?m+1:n+1;</p><p><b> }</b></p><p> else return 0;</p><p>
91、<b> }</b></p><p> int depthx(bitree t,char x)</p><p><b> {</b></p><p><b> int m,n;</b></p><p><b> if(t)</b></p&g
92、t;<p><b> {</b></p><p> if(t->data==x) return getdepth(t);</p><p><b> else</b></p><p><b> {</b></p><p> m=depthx(t-&g
93、t;lchild,x);</p><p> n=depthx(t->rchild,x);</p><p> return m>=n?m:n;</p><p><b> }</b></p><p><b> }</b></p><p> else retu
94、rn 0;</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p><b> bitree t;</b></p><p><b> int w,v;<
95、/b></p><p><b> char x;</b></p><p> printf("請輸入以建立二叉樹:");</p><p> createbitree(t);</p><p> printf("二叉樹的深度是:");</p><p>
96、; w=getdepth(t);</p><p> printf("%d\n",w);</p><p> scanf("%c",&x);</p><p> printf("請輸入x:");</p><p> scanf("%c",&x);
97、</p><p> v=depthx(t,x);</p><p> printf("二叉樹中以元素值為x的結(jié)點(diǎn)為根的子樹的深度是:");</p><p> printf("%d\n",v);</p><p><b> }</b></p><p>&l
98、t;b> 運(yùn)行結(jié)果為</b></p><p> ?。?) 求二叉樹的葉子節(jié)點(diǎn)個(gè)#include <stdio.h></p><p> #include <malloc.h></p><p> #include <process.h></p><p> #define ok 1&l
99、t;/p><p> #define error 0</p><p> #define overflow -1</p><p> typedef char status;</p><p> typedef char telemtype;</p><p> typedef struct bitnode<
100、;/p><p><b> {</b></p><p> telemtype data;</p><p> struct bitnode *lchild,*rchild;</p><p> }bitnode,*bitree;</p><p> status createbitree(bit
101、ree &t)</p><p><b> {</b></p><p><b> char ch;</b></p><p> scanf("%c",&ch);</p><p> if(ch=='#') t=NULL;</p>
102、<p><b> else</b></p><p><b> {</b></p><p> if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);</p><p> t->data=ch;</p><p>
103、createbitree(t->lchild);</p><p> createbitree(t->rchild);</p><p><b> }</b></p><p> return ok;</p><p><b> }</b></p><p> s
104、tatus POLeafNodeNum(int& i,bitree& t)</p><p><b> {</b></p><p><b> if(t)</b></p><p><b> {</b></p><p> if(!t->lchild &a
105、mp;& !t->rchild) i++;</p><p> POLeafNodeNum(i,t->lchild);</p><p> POLeafNodeNum(i,t->rchild);</p><p><b> }</b></p><p><b> return i;&l
106、t;/b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p><b> bitree t;</b></p><p> int i=0,w;</p&g
107、t;<p> printf("請讀入字符建立二叉鏈表:\n");</p><p> createbitree(t); </p><p> printf("二叉樹的葉子結(jié)點(diǎn)的數(shù)目為:");</p><p> w=POLeafNodeNum(i,t);</p><p> printf
108、("%d",w);</p><p> printf("\n");</p><p><b> }</b></p><p><b> 運(yùn)行結(jié)果為</b></p><p><b> 五、課程設(shè)計(jì)總結(jié)</b></p><
109、;p> 本程序基本上實(shí)現(xiàn)了前序遍歷,中序遍歷,后序遍歷,葉子結(jié)點(diǎn)個(gè)數(shù)的求出,二叉樹深度的求出等基本操作。 </p><p> 在本次課程設(shè)計(jì)的學(xué)習(xí)過程中,我在其中的最大的收獲,就是得到了許多的經(jīng)驗(yàn)以及軟件設(shè)計(jì)的一些新的思路。 </p><p> 邁著時(shí)間的步伐,這次的課程設(shè)計(jì)也即將結(jié)束,但這個(gè)學(xué)期數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)還是具有相當(dāng)大的意義,特別是這次的課程設(shè)計(jì),它從一個(gè)程度上改變了我的
110、編程思想,如何將一個(gè)程序快速而又準(zhǔn)備的進(jìn)行編寫,進(jìn)行編譯,都成為了我思考的重點(diǎn)。同時(shí)通過這一個(gè)學(xué)期的學(xué)習(xí),我們將數(shù)據(jù)結(jié)構(gòu)的思想帶入到了我們以后的編程學(xué)習(xí)中去。在這個(gè)階段,我也明白了,好的思想,不能提留于字面上的認(rèn)知,還需要平時(shí)多練多寫一些相關(guān)的程序,并且通過修改,加入新的算法去嘗試改變自己的一些編程思想。保持更新算法的速度,這才是關(guān)鍵。</p><p> 但在這次的課設(shè)中也遇了一些問題。做二叉樹之前,必須先構(gòu)思
111、出怎樣建立和想要實(shí)現(xiàn)那些功能。然后分塊去建立各自的模型。由于做好了這些工作,我的課程設(shè)計(jì)進(jìn)行的還比較順利。但是,也出現(xiàn)一些很基礎(chǔ)很低級的錯(cuò)誤,后來經(jīng)過自己的仔細(xì)分析,終于圓滿完成。這說明我的程序設(shè)計(jì)基礎(chǔ)還不是太扎實(shí),還需要多上機(jī)實(shí)現(xiàn),不能陷入只看不做的誤區(qū)。</p><p> 通過這次的課程設(shè)計(jì),我從中得到了許多經(jīng)驗(yàn)和軟件設(shè)計(jì)的一些新思路。從二叉樹問題設(shè)計(jì)以及分析中,我理解到了數(shù)據(jù)結(jié)構(gòu)對于軟件設(shè)計(jì)的重要性。它的
112、使用,可以改變軟件的運(yùn)行周期,思路從繁化簡,并且都能夠通過其相關(guān)引導(dǎo),將本身以前編程思想進(jìn)行擴(kuò)充,發(fā)展。這也是在這次課程設(shè)計(jì)中我所掌握得到的。</p><p> 二叉樹的基本操作是多種多樣的,由于水平有限,故不能做太大規(guī)模的設(shè)計(jì)。雖然程序規(guī)模不大,程序也都較基礎(chǔ),但我依然為此付出了努力,仍免不了各種錯(cuò)誤的出現(xiàn)。編程過程需要很大的毅力和耐心,而且要有良好的思維和扎實(shí)的專業(yè)基礎(chǔ)知識,所以我需要不斷努力的學(xué)習(xí),發(fā)現(xiàn)自
113、身不足之處并努力改正它,逐步提高自身的能力,不斷取得進(jìn)步。通過實(shí)踐,我認(rèn)識到知識運(yùn)用的重要性,并且努力加深對基礎(chǔ)知識的理解,從中了解自己需要學(xué)習(xí)的東西并學(xué)會(huì)自學(xué)。作為一名計(jì)算機(jī)專業(yè)的學(xué)生,今后我會(huì)加緊學(xué)習(xí),為將來打下堅(jiān)實(shí)的基礎(chǔ)。</p><p><b> 參考文獻(xiàn)</b></p><p> 嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)(C語言版).北京:清華大學(xué)出版社,2007<
114、;/p><p> 嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)題集(C語言版).北京:清華大學(xué)出版社,2007</p><p> 高一凡,《數(shù)據(jù)結(jié)構(gòu)》算法實(shí)現(xiàn)及解析.西安:西安電子科技大學(xué)出版社,2005 </p><p> 譚浩強(qiáng),C程序設(shè)計(jì)(第四版).北京:清華大學(xué)出版社,2010</p><p><b> 附錄 </b>&l
115、t;/p><p><b> 致謝</b></p><p> 在這次課程設(shè)計(jì)的撰寫過程中,我得到了許多人的幫助。</p><p> 首先我要感謝我的老師在課程設(shè)計(jì)上給予我的指導(dǎo)、提供給我的支持和幫助,本次課程設(shè)計(jì)是在王淑禮老師的悉心指導(dǎo)下完成的,老師淵博的知識,嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度,一絲不茍的工作作風(fēng),平易近人的性格都是我學(xué)習(xí)的楷模。在課程設(shè)計(jì)的研究
116、及整理期間,,我遇到了不少問題,主要包括程序和課程設(shè)計(jì)的撰寫上的,老師給了我很大的支持和鼓勵(lì),才使得論文得以順利的完成,這是我能順利完成這次報(bào)告的主要原因,更重要的是老師幫我解決了許多技術(shù)上的難題,讓我能把系統(tǒng)做得更加完善。在此期間,我不僅學(xué)到了許多新的知識,而且也開闊了視野,提高了自己的設(shè)計(jì)能力。</p><p> 其次,我要感謝幫助過我的同學(xué),他們也為我解決了不少我不太明白的設(shè)計(jì)商的難題。在作課程設(shè)計(jì)期間,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二叉樹的基本操作課程設(shè)計(jì)
- 二叉樹課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-二叉樹的基本操作
- 遍歷二叉樹課程設(shè)計(jì)
- 課程設(shè)計(jì) 排序二叉樹
- 平衡二叉樹匹配課程設(shè)計(jì)
- 平衡二叉樹匹配課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉樹的操作
- 課程設(shè)計(jì)---判斷完全二叉樹
- 課程設(shè)計(jì)---二叉樹的查找
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)--線索二叉樹的基本操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹的相關(guān)操作
- 課程設(shè)計(jì)---完全二叉樹的判斷
- 二叉樹數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 二叉樹論文 二叉樹的應(yīng)用
- ds課程設(shè)計(jì)報(bào)告--平衡二叉樹
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計(jì)
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--二叉排序樹調(diào)整為平衡二叉樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---計(jì)算二叉樹高度
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹的應(yīng)用
評論
0/150
提交評論