版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)學(xué)與計算機學(xué)院</b></p><p><b> 課程設(shè)計說明書</b></p><p> 課 程 名 稱: 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計 </p><p> 課 程 代 碼: </p><p> 題 目: 線索二
2、叉樹的基本操作 </p><p> 年級/專業(yè)/班: 2012級軟件工程4班 </p><p> 學(xué) 生 姓 名: 吳海燕 </p><p> 學(xué) 號: </p><p> 開 始
3、時 間: 2013 年 12 月 18 日</p><p> 完 成 時 間: 2013 年 12 月 28 日</p><p><b> 課程設(shè)計成績:</b></p><p> 指導(dǎo)教師簽名: 年 月 日</p><p><b> 目 錄
4、</b></p><p><b> 1 需求分析1</b></p><p> 1.1任務(wù)與分析1</p><p><b> 1.2測試數(shù)據(jù)2</b></p><p><b> 2 概要設(shè)計3</b></p><p> 2.1
5、 模塊劃分3</p><p> 2.2模塊中的層次圖3</p><p><b> 3 詳細(xì)設(shè)計4</b></p><p> 3.1結(jié)構(gòu)體設(shè)計4</p><p> 3.2創(chuàng)建二叉樹4</p><p> 3.3二叉樹線索化5</p><p> 3.4二叉
6、樹中插入結(jié)點6</p><p> 3.5刪除結(jié)點函數(shù)8</p><p> 3.6查找前驅(qū)后繼函數(shù)11</p><p><b> 4 調(diào)試分析12</b></p><p> 5 用戶使用說明12</p><p><b> 6 測試結(jié)果12</b></
7、p><p> 6.1新建二叉樹12</p><p> 6.2中序遍歷13</p><p> 6.3查找前驅(qū)13</p><p> 6.4查找后繼14</p><p> 6.5刪除結(jié)點14</p><p> 6.6插入左孩子15</p><p> 6.
8、7插入右孩子15</p><p><b> 6.8退出16</b></p><p><b> 結(jié) 論17</b></p><p><b> 致 謝18</b></p><p><b> 參考文獻(xiàn)19</b></p>&l
9、t;p><b> 摘 要 </b></p><p> 首先是對需求分析的簡要闡述,說明系統(tǒng)要完成的任務(wù)和相應(yīng)的分析,并給出測試數(shù)據(jù)。其次是概要設(shè)計,說明模塊的劃分以及模塊間的層次關(guān)系,然后是詳細(xì)設(shè)計,描述實現(xiàn)概要設(shè)計中定義的基本功操作和所有數(shù)據(jù)類型,以及函數(shù)的功能及代碼實現(xiàn)。再次是對系統(tǒng)的調(diào)試分析說明,以及遇到的問題和解決問題的方法。然后是用戶使用說明書的闡述,然后是測試的數(shù)據(jù)
10、和結(jié)果的分析,最后是對本次課程設(shè)計的結(jié)論。</p><p> 關(guān)鍵詞:線索化,中序遍歷,插入,刪除,查找</p><p><b> 引 言</b></p><p> 數(shù)據(jù)結(jié)構(gòu)是計算機專業(yè)重要的專業(yè)基礎(chǔ)課程與核心課程之一,在計算機領(lǐng)域應(yīng)用廣泛,計算機離不開數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計為了能使我們掌握所學(xué)習(xí)的知識并有應(yīng)用到實際的設(shè)計中的能力,
11、對于掌握這門課程的學(xué)習(xí)方法有極大的意義。本課程設(shè)計的題目為“線索二叉樹的基本操作”,完成將二叉樹轉(zhuǎn)化成線索二叉樹,采用中序線索二叉樹的操作。本課程設(shè)計采用的編程環(huán)境為Microsoft Visual Studio 2008。</p><p><b> 1 需求分析 </b></p><p> 當(dāng)用二叉鏈表作為二叉樹的存儲結(jié)構(gòu)時,因為每個結(jié)點中只有指向其左、右兒子結(jié)
12、點的指針,所以從任一結(jié)點出發(fā)只能直接找到該結(jié)點的左、右兒子。在一般情況下靠它無法直接找到該結(jié)點在某種遍歷序下的前驅(qū)和后繼結(jié)點。如果在每個結(jié)點中增加指向其前驅(qū)和后繼結(jié)點的指針,將降低存儲空間的效率。</p><p> 我們可以證明:在n個結(jié)點的二叉鏈表中含有n+1個空指針。因為含n個結(jié)點的二叉鏈表中含有2n個指針,除了根結(jié)點,每個結(jié)點都有一個從父結(jié)點指向該結(jié)點的指針,因此一共使用了n-1個指針,所以在n個結(jié)點的二
13、叉鏈表中含有n+1個空指針。</p><p> 因此可以利用這些空指針,存放指向結(jié)點在某種遍歷次序下的前驅(qū)和后繼結(jié)點的指針。這種附加的指針稱為線索,加上了線索的二叉鏈表稱為線索鏈表,相應(yīng)的二叉樹稱為線索二叉樹(Threaded Binary Tree)。根據(jù)線索性質(zhì)的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和后序線索二叉樹三種。</p><p><b> 1.1任
14、務(wù)與分析 </b></p><p><b> 任務(wù):</b></p><p> 建立一棵二叉樹(用戶自行輸入二叉樹,用“#”表示空格,按回車鍵結(jié)束),將其線索化,并實現(xiàn)以下功能:</p><p> 1)遍歷二叉樹(本程序使用中序遍歷方法)</p><p> 2)在二叉樹中插入一個結(jié)點</p>
15、;<p> 3)刪除二叉樹的某個結(jié)點</p><p> 4)查找某個結(jié)點的前驅(qū)</p><p> 5)查找某個結(jié)點的后繼</p><p><b> 分析:</b></p><p> 該任務(wù)是關(guān)于線索二叉樹的運算,其中的基本運算應(yīng)基于二叉樹,但又有所不同,首先應(yīng)了解的問題有:</p>
16、<p> 1)線索二叉樹是如何建立的,是通過二叉樹來實現(xiàn)線索化,還是直接進(jìn)行線索化的輸入。若由二叉樹建立而來,該二叉樹應(yīng)如何輸入,對于具體的二叉樹應(yīng)該使初使用者明白使用的格式。</p><p> 2)該程序重點內(nèi)容是有關(guān)于二叉樹的插入、刪除和查找前驅(qū)后繼,在進(jìn)行具體的操作時,規(guī)則是什么,依照什么原則。</p><p> 3)對于插入、刪除、查找前驅(qū)后繼等,其結(jié)果是否符合預(yù)訂
17、的目標(biāo),須由自己判定。</p><p><b> 1.2測試數(shù)據(jù) </b></p><p> 測試數(shù)據(jù):ABD#G###CE##F##</p><p><b> 圖1-1 測試數(shù)據(jù)</b></p><p><b> 2 概要設(shè)計 </b></p><
18、;p><b> 2.1 模塊劃分</b></p><p> 二叉樹的建立函數(shù):Creat(ThrNode<T> *bt)</p><p> 中序遍歷函數(shù):void InOrder()</p><p> 中序線索化函數(shù):void ThrBiTree(ThrNode<T>*bt)</p><
19、p> 查找結(jié)點函數(shù):ThrNode<T>*locate(ThrNode<T>*bt,T x)</p><p> 插入結(jié)點函數(shù):void InsertLeft(ThrNode<T>*s,T x,T y)</p><p> void InsertRight(ThrNode<T>*s,T x,T y)</p><p&
20、gt; 刪除函數(shù):void Delete(ThrNode<T>*child ,ThrNode<T>*F)</p><p> 查找結(jié)點的前驅(qū)、后繼函數(shù):ThrNode<T>*Former(ThrNode<T>*p)</p><p> ThrNode<T>*Next(ThrNode<T>*p)</p>
21、<p> 2.2模塊中的層次圖</p><p><b> 圖2-1層次模塊圖</b></p><p><b> 3 詳細(xì)設(shè)計</b></p><p><b> 3.1結(jié)構(gòu)體設(shè)計</b></p><p> 二叉樹的遍歷本質(zhì)上是將一個復(fù)雜的非線性結(jié)構(gòu)轉(zhuǎn)換為線性結(jié)
22、構(gòu),使每個結(jié)點都有了唯一前驅(qū)和后繼(第一個結(jié)點無前驅(qū),最后一個結(jié)點無后繼)。對于二叉樹的一個結(jié)點,查找其左右子女是方便的,其前驅(qū)后繼只有在遍歷中得到。為了容易找到前驅(qū)和后繼,有兩種方法。一是在結(jié)點結(jié)構(gòu)中增加向前和向后的指針,這種方法增加了存儲開銷,不可?。欢抢枚鏄涞目真溨羔槨,F(xiàn)將二叉樹的結(jié)點結(jié)構(gòu)重新定義如下:</p><p> struct ThrNode</p><p><
23、b> {</b></p><p><b> T data;</b></p><p> ThrNode<T> *lchild, *rchild;</p><p> int ltag,rtag;</p><p><b> };</b></p><
24、;p> 其中:ltag=0 時 lchild指向左子女;</p><p> ltag=1 時 lchild指向前驅(qū); </p><p> rtag=0 時 rchild指向左子女; </p><p> rtag=1 時 rchild指向后繼; </p><p> 以這種結(jié)點結(jié)構(gòu)構(gòu)成的二叉鏈表作為二叉樹的存儲結(jié)構(gòu),叫做線索鏈表
25、,指向前驅(qū)和后繼的指針叫線索,加上線索的二叉樹叫線索二叉樹,對二叉樹進(jìn)行某種形式遍歷使其變?yōu)榫€索二叉樹的過程叫線索化。 學(xué)習(xí)線索化時,有三點必須注意:一是何種“序”的線索化,是先序、中序還是后序;二是要“前驅(qū)”線索化、“后繼”線索化還是“全”線索化(前驅(qū)后繼都要);三是只有空指針處才能加線索。</p><p><b> 3.2創(chuàng)建二叉樹</b></p><p>
26、采用遞歸算法實現(xiàn)二叉樹的建立,按照某種次序依次輸入二叉樹中結(jié)點,用“#”表示結(jié)束標(biāo)志。</p><p> template<class T></p><p> ThrNode<T>*MyTree<T>::Creat(ThrNode<T> *bt) //建立一棵線索二叉樹</p><p><b> {&
27、lt;/b></p><p><b> char ch;</b></p><p> cout<<"請輸入一個結(jié)點:";</p><p><b> cin>>ch;</b></p><p> if(ch=='#') bt=NUL
28、L; //建立一棵空樹</p><p><b> else</b></p><p><b> {</b></p><p> bt=new ThrNode<T>;</p><p> bt->data=ch; //生成一個結(jié)點</p><p&
29、gt; bt->ltag=0; //左標(biāo)志置為</p><p> bt->rtag=0; //右標(biāo)志置為</p><p> bt->lchild=Creat(bt->lchild); //遞歸建立左子樹</p><p> bt->rchild=Creat(bt->rchild); //遞歸建立右子樹
30、</p><p><b> }</b></p><p> return bt;</p><p><b> }</b></p><p><b> 3.3二叉樹線索化</b></p><p> 按照一定的順序來進(jìn)行線索化。要實現(xiàn)線索化,就要知道結(jié)
31、點*pre是結(jié)點*p的前驅(qū),而*p是*pre的后繼。這樣,當(dāng)遍歷到結(jié)點*p時,可以進(jìn)行,若*p有空指針域,則將相應(yīng)的標(biāo)志置1;若*p的左線索標(biāo)志已經(jīng)建立(p->ltag==1),則可使其前驅(qū)線索化,令p->lchild=pre;若*pre的右線索標(biāo)志已經(jīng)建立(pre->rtag==1),則可使其后繼化,令pre->rchild=p;</p><p> template<class
32、T> //中序線索化鏈表</p><p> void MyTree<T>::ThrBiTree(ThrNode<T> *bt)</p><p><b> {</b></p><p> if(bt==NULL)</p><p><b> return;</b>&
33、lt;/p><p> ThrBiTree(bt->lchild);</p><p> if(bt->lchild==NULL) //對bt的左指針進(jìn)行處理</p><p><b> {</b></p><p> bt->ltag=1;</p><p> bt->lc
34、hild=pre; //設(shè)置pre的前驅(qū)線索</p><p><b> }</b></p><p> if(bt->rchild==NULL) //對bt的右指針進(jìn)行處理</p><p> bt->rtag=1;</p><p> if(pre!=NULL&&pre->rta
35、g==1) //設(shè)置pre的后繼線索</p><p> pre->rchild=bt;</p><p><b> pre=bt;</b></p><p> ThrBiTree(bt->rchild);</p><p><b> }</b></p><p>
36、 3.4二叉樹中插入結(jié)點</p><p> 在樹中插入一個結(jié)點,就必須要以一定的規(guī)則來進(jìn)行插入。首先要找到待插入結(jié)點的父結(jié)點,然后選擇是左孩子還是右孩子插入,再看要插入的位置是否已經(jīng)有其他結(jié)點,若有,則將要插入的結(jié)點作為該結(jié)點的前驅(qū)插入樹中,若沒有則直接插入。</p><p> template<class T> //插入左孩子</p><p>
37、; void MyTree<T>::InsertLeft(ThrNode<T>*s,T x,T y)</p><p><b> {</b></p><p> ThrNode<T> *newL,*t;//newL是待插入結(jié)點,*t是*s的前驅(qū)結(jié)點</p><p> s=locate(s,x);</
38、p><p><b> if(s==0)</b></p><p><b> {</b></p><p> cout<<"插入出錯!"<<endl;</p><p><b> return;</b></p><p&
39、gt;<b> }</b></p><p> newL=new ThrNode<T>;</p><p> newL->data=y;</p><p> newL->lchild=NULL;</p><p> newL->rchild=NULL;</p><p&g
40、t; if(s->ltag==1)</p><p><b> {</b></p><p> t=s->lchild; //記住s的前驅(qū)結(jié)點,作為newL的前驅(qū)</p><p> newL->lchild=t; //將待插入結(jié)點前驅(qū)化</p><p> newL->ltag=1;&l
41、t;/p><p> s->lchild=newL; //將待插入結(jié)點插入,作為s的左孩子</p><p> s->ltag=0;</p><p> newL->rchild=s; //將插入結(jié)點后繼化</p><p> newL->rtag=1;</p><p><b>
42、 }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(t=s->lchild;t->rtag==0;)// 確定*s的前驅(qū)結(jié)點</p><p> t=t->rchild;// *s的前驅(qū)*t是
43、*s左孩子的最右下方的結(jié)點</p><p> t->rchild=newL;// 后繼化</p><p> newL->ltag=0;</p><p> newL->lchild=s->lchild;//將插入結(jié)點前驅(qū)化</p><p><b> }</b></p><
44、p> s->ltag=0;</p><p> s->lchild=newL;// 將待插入結(jié)點插入,作為s的左孩子</p><p> newL->rtag=1;</p><p> newL->rchild=s;// 將插入結(jié)點后繼化</p><p><b> }</b></p
45、><p> template<class T> //插入右孩子</p><p> void MyTree<T>::InsertRight(ThrNode<T>*s,T x,T y)</p><p><b> {</b></p><p> ThrNode<T> *n
46、ewR,*t;//newR是待插入結(jié)點,*t是*s的后繼結(jié)點</p><p> s=locate(s,x);</p><p><b> if(s==0)</b></p><p><b> {</b></p><p> cout<<"插入出錯!";</p
47、><p><b> return;</b></p><p><b> }</b></p><p> newR=new ThrNode<T>;</p><p> newR->data=y;</p><p> newR->lchild=NULL;&l
48、t;/p><p> newR->rchild=NULL;</p><p> if(s->rtag==1)</p><p><b> {</b></p><p> t=s->rchild; //記住s的后繼結(jié)點,作為newR的后繼</p><p> newR->
49、rchild=t; //將待插入結(jié)點后繼化</p><p> newR->rtag=1;</p><p> s->rchild=newR; //將待插入結(jié)點插入,作為s的右孩子</p><p> s->rtag=0;</p><p> newR->lchild=s; //將插入點前驅(qū)化</
50、p><p> newR->ltag=1;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(t=s->rchild;t->lt
51、ag==0;)// 確定*s的后繼結(jié)點</p><p> t=t->lchild;// *s的后繼*t是*s右孩子的最左下方的結(jié)點</p><p> t->lchild=newR;//前驅(qū)化</p><p> newR->rtag=0;</p><p> newR->rchild=s->rchild;//
52、 s原來的后繼作為插入點的右孩子 </p><p><b> }</b></p><p> s->rtag=0;</p><p> s->rchild=newR;// 將待插入結(jié)點插入,作為s的右孩子</p><p> newR->ltag=1;</p><p> ne
53、wR->lchild=s;// 插入點前驅(qū)化 </p><p><b> }</b></p><p><b> 3.5刪除結(jié)點函數(shù)</b></p><p> 要在樹中刪除一個結(jié)點,也要考慮不同的情況。在刪除結(jié)點前要先找到該結(jié)點和它的父結(jié)點,然后再進(jìn)行刪除操作。</p><p><b
54、> 刪除的具體情況:</b></p><p> 1).當(dāng)結(jié)點是父親結(jié)點的左孩子時 </p><p> 若孩子結(jié)點沒有左右孩子:則直接刪除; </p><p> 若孩子結(jié)點有左孩子沒右孩子:則將孩子結(jié)點的左孩子給父親結(jié)點的左孩子; </p><p> 若孩子結(jié)點有右孩子沒左孩子:則將孩子
55、結(jié)點的右孩子給父親結(jié)點的左孩子;4.若孩子結(jié)點左右孩子都有:將左孩子上提,孩子結(jié)點的左子樹的右子樹接到孩子結(jié)點的右子樹的最左下結(jié)點的左子樹,再將孩子結(jié)點的右子樹接到孩子結(jié)點左子樹的右子樹。 </p><p> 2).當(dāng)結(jié)點是父親結(jié)點的右孩子: </p><p> 1.若孩子結(jié)點沒有左右孩子:則直接刪除; </p><p> 2.若
56、孩子結(jié)點有左孩子沒右孩子:則將孩子結(jié)點的左孩子給父親結(jié)點的右孩子;</p><p> 3.若孩子結(jié)點有右孩子沒左孩子:則將孩子結(jié)點的右孩子給父親結(jié)點的右孩子;</p><p> 4.若孩子結(jié)點左右孩子都有:將右孩子上提,將孩子結(jié)點的右子樹的左子樹接到孩子結(jié)點的左子樹的最右下結(jié)點的右子樹,再將孩子結(jié)點的左子樹接到孩子結(jié)點右子樹的左子樹。</p><p> tem
57、plate<class T>//刪除結(jié)點</p><p> void MyTree<T>::Delete(ThrNode<T>*child ,ThrNode<T>*F)//child為待刪除的結(jié)點,F(xiàn)是child的父結(jié)點</p><p><b> {</b></p><p> ThrNode
58、<T>*s;</p><p><b> s=0;</b></p><p> if(child==F->lchild||child==F)//是父親結(jié)點的左孩子</p><p><b> {</b></p><p> if(child->ltag==1&&
59、;child->rtag==1)//孩子結(jié)點左右為空</p><p><b> {</b></p><p> F->lchild=child->lchild;//child結(jié)點后繼指向F,只要保存前驅(qū)</p><p> F->ltag=1;</p><p><b> }</
60、b></p><p> else if(child->ltag==0&&child->rtag==1)//孩子結(jié)點有左孩子無右孩子</p><p><b> {</b></p><p> F->lchild=child->lchild;//把child左孩子向上提,即刪除child</p
61、><p> s=child->lchild;</p><p> while(s->rchild)//查找child左孩子最右下結(jié)點</p><p> s=s->rchild;</p><p> s->rchild=child->rchild;//后繼化</p><p><b>
62、; }</b></p><p> else if(child->ltag==1&&child->rtag==0)//孩子結(jié)點有右孩子無左孩子</p><p><b> {</b></p><p> F->lchild=child->rchild;//把右孩子上提,即刪除child<
63、;/p><p> s=child->rchild;</p><p> while(s->lchild)//查找child右孩子的最左下結(jié)點</p><p> s=s->lchild;</p><p> s->lchild=child->lchild;//前驅(qū)化</p><p><
64、b> }</b></p><p> else if(child->ltag==0&&child->rtag==0)//孩子結(jié)點左右孩子都有</p><p><b> {</b></p><p> ThrNode<T>*q;</p><p> F->
65、lchild=child->lchild;//將child左孩子上提</p><p> s=child->rchild;</p><p> while(s->lchild)//查找child右孩子的最左下結(jié)點</p><p> s=s->lchild;</p><p> s->lchild=child-&
66、gt;lchild->rchild;//若child->lchild右子樹非空,把child左孩子的右子樹接到右子樹的最左下結(jié)點</p><p> if(child->lchild->rtag==0)//child->lchild右子樹非空</p><p> s->ltag=0;</p><p> q=child->l
67、child;</p><p> while(q->rchild!=NULL)</p><p> q=q->rchild;</p><p> q->rchild=s;//把q的后繼指到s上</p><p> child->lchild->rchild=child->rchild;//設(shè)置child左孩
68、子的右子樹</p><p> child->lchild->rtag=0; </p><p><b> }</b></p><p><b> }</b></p><p> if(child==F->rchild||child==F)//是父親結(jié)點的右孩子</p>
69、;<p><b> {</b></p><p> if(child->ltag==1&&child->rtag==1)//孩子結(jié)點沒有左右孩子</p><p><b> {</b></p><p> F->rchild=child->rchild;//child
70、的后繼為空</p><p> F->rtag=1;</p><p><b> }</b></p><p> else if(child->ltag==0&&child->rtag==1)//孩子結(jié)點有左孩子,無右孩子</p><p><b> {</b>&l
71、t;/p><p> F->rchild=child->lchild;//將孩子結(jié)點的右孩子向上提</p><p> s=child->lchild;</p><p> while(s->rchild)//查找孩子結(jié)點左子樹的最右結(jié)點</p><p> s=s->rchild;</p><p
72、> s->rchild=child->rchild;//后繼化</p><p><b> }</b></p><p> else if(child->ltag==1&&child->rtag==0)//孩子結(jié)點有右孩子無左孩子</p><p><b> {</b>
73、</p><p> F->rchild=child->rchild;//將孩子結(jié)點的右孩子向上提</p><p> s=child->rchild;</p><p> while(s->lchild)//查找孩子結(jié)點右子樹的最左結(jié)點</p><p> s=s->lchild;</p><
74、;p> s->lchild=F;//前驅(qū)化</p><p><b> }</b></p><p> else if(child->ltag==0&&child->rtag==0)//孩子結(jié)點既有左孩子又有右孩子</p><p><b> {</b></p>&l
75、t;p> ThrNode<T>*q;</p><p> F->rchild=child->rchild;//將child右孩子上提</p><p> s=child->lchild;</p><p> while(s->rchild)//查找child左孩子的最右下結(jié)點</p><p> s
76、=s->rchild;</p><p> s->rchild=child->rchild->lchild;//若child->rchild右子樹非空,把child右孩子的左子樹接到左子樹的最右下結(jié)點</p><p> if(child->rchild->ltag==0)//child->rchild的左子樹非空</p>&l
77、t;p> s->rtag=0;</p><p> q=child->rchild;</p><p> while(q->lchild!=NULL)</p><p> q=q->lchild;</p><p> q->lchild=s;//把q的后繼指到s上</p><p>
78、 child->rchild->lchild=child->lchild;//設(shè)置child右孩子的左子樹</p><p> child->rchild->ltag=0; </p><p><b> }</b></p><p><b> }</b></p><p&
79、gt;<b> } </b></p><p> 3.6查找前驅(qū)后繼函數(shù)</p><p> 前驅(qū)和后繼就是某個結(jié)點左右指針指向的結(jié)點,查找前驅(qū)和后繼與二叉樹線索化得次序有關(guān)。</p><p> template<class T></p><p> ThrNode<T>*MyTre
80、e<T>::Former(ThrNode<T>*p)</p><p><b> {</b></p><p> ThrNode<T> *q;//p為待查找結(jié)點,q為p的前驅(qū)</p><p> if(p==0)return 0;</p><p><b> q=0;<
81、/b></p><p> if(p->ltag==1)</p><p> q=p->lchild; //左標(biāo)志為,可直接得到前驅(qū)結(jié)點</p><p><b> else</b></p><p><b> {</b></p><p> q=p-&
82、gt;lchild; //工作指針q指向結(jié)點p的左孩子</p><p> while(q->rtag==0)</p><p> q=q->rchild; //查找最右下結(jié)點</p><p><b> }</b></p><p><b> return q;</b></
83、p><p><b> }</b></p><p> template<class T></p><p> ThrNode<T>*MyTree<T>::Next(ThrNode<T>*p)</p><p><b> {</b></p>
84、<p> ThrNode<T> *q;//p為待查找結(jié)點,q為p的后繼</p><p> if(p==0) return 0;</p><p><b> q=0;</b></p><p> if(p->rtag==1)</p><p> q=p->rchild; //右標(biāo)
85、志為,可直接得到后繼結(jié)點</p><p><b> else</b></p><p><b> {</b></p><p> q=p->rchild; //工作指針q指向結(jié)點p的右孩子</p><p> while(q->ltag==0)</p><p&g
86、t; q=q->lchild; //查找最左下結(jié)點</p><p><b> }</b></p><p><b> return q;</b></p><p><b> }</b></p><p><b> 4 調(diào)試分析</b></
87、p><p> 在上面給出測試的所有數(shù)據(jù),按照上面的數(shù)據(jù)錄入即可。</p><p> 問題:在測試過程中沒有給測試者提供相關(guān)的錄入信息要求,導(dǎo)致錄入要求不合格,程序不能正常運行。</p><p> 解決方法:經(jīng)過添加錄入信息提示可解決這個問題。</p><p><b> 5 用戶使用說明</b></p>
88、<p> 直接按照菜單上面的提示從鍵盤上錄入數(shù)據(jù)即可,不需要過多的操作。該軟件操作界面簡潔美觀,操作簡單,適合用戶使用。</p><p><b> 6 測試結(jié)果</b></p><p><b> 6.1新建二叉樹</b></p><p> 圖6-1 構(gòu)建二叉樹</p><p>&l
89、t;b> 6.2中序遍歷</b></p><p><b> 圖6-2中序遍歷</b></p><p><b> 6.3查找前驅(qū)</b></p><p> 圖6-3 查找指定結(jié)點的前驅(qū)</p><p><b> 6.4查找后繼</b></p>
90、;<p> 圖6-4 查找指定結(jié)點的后繼</p><p><b> 6.5刪除結(jié)點</b></p><p> 圖6-5 刪除一個結(jié)點</p><p><b> 6.6插入左孩子</b></p><p> 圖6-6 在左子樹插入一個結(jié)點</p><p>
91、;<b> 6.7插入右孩子</b></p><p> 圖6-7 在右子樹插入一個結(jié)點</p><p><b> 6.8退出</b></p><p><b> 圖6-8 退出系統(tǒng)</b></p><p><b> 結(jié) 論 </b></p
92、><p> 本次課程設(shè)計“線索二叉樹的基本操作”按照任務(wù)書相應(yīng)的要求成功的完成了任務(wù),由于本課程設(shè)計涉及中序的線索化以及相應(yīng)的相關(guān)插入刪除等操作,因此對算法的設(shè)計以及相關(guān)函數(shù)的調(diào)用要求很高,需要通過反復(fù)的查看相關(guān)書籍才能完成。</p><p> 當(dāng)我開始編寫這個題目的代碼的時候,我覺得難度相當(dāng)?shù)拇?。成天的抱怨我怎么選這么難的題目。在我寫完所有代碼的時候,我發(fā)現(xiàn)問題太多了。最開始連一棵樹都不
93、能構(gòu)造出來程序就停止工作,然后經(jīng)過一歩一步的調(diào)試,終于改對了,卻發(fā)現(xiàn)每個功能函數(shù)都不能實現(xiàn),都存在各種各樣的問題。很多時候不知道怎么改,而且老師同學(xué)一時半會兒也講不清楚,因為他們不知道我的程序具體是怎樣寫的。只有幫我調(diào)試,然后慢慢糾錯。即使這樣,好多問題依然沒有得到解決。頓時,心情變得極為糟糕,曾有過放棄的念頭。但是,看見別的同學(xué)都能耐心的做,而且我害怕掛科,所以我只能繼續(xù)耐心的做下去。還好皇天不負(fù)苦心人,終于讓我的付出有了收獲。<
94、;/p><p> 我覺得編程邏輯思維很重要,在實現(xiàn)每一個功能的時候,要先想清楚具體怎么做,然后再編寫代碼。在編程的時候應(yīng)該每編寫出一個功能,要待其實現(xiàn)后再去編寫下一個功能。不能把所有功能函數(shù)全部寫出來再來慢慢改錯、糾正,這樣會浪費更多的時間。</p><p> 通過這次課程設(shè)計,我學(xué)會了自己主動去學(xué)習(xí)一些東西,而且也漸漸明白了數(shù)據(jù)結(jié)構(gòu)這門課的實用性,雖然我覺得有的地方很難,需要向老師同學(xué)請
95、教,但也慢慢對軟件工程產(chǎn)生了興趣。</p><p><b> 致 謝 </b></p><p> 在這次課程設(shè)計過程中,首先感謝輔導(dǎo)老師對我的指導(dǎo);同時也感謝耐心幫助我的同學(xué)。我也感謝自己,感謝自己沒有放棄,感謝中堅持到了最后;感謝這次數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計,我學(xué)到了很多,感謝這次實訓(xùn)。</p><p><b> 參考文獻(xiàn) &
96、lt;/b></p><p> [1] 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu).清華大學(xué)出版社出版。 </p><p> [2] 嚴(yán)蔚敏,吳偉民. 數(shù)據(jù)結(jié)構(gòu)題集(C語言版) .清華大學(xué)出版社.2003年5月。</p><p> [3]唐策善,李龍澎.數(shù)據(jù)結(jié)構(gòu)(作C語言描述) .高等教育出版社.2001年9月</p><p> [4] 朱戰(zhàn)立
97、.數(shù)據(jù)結(jié)構(gòu)(C++語言描述)(第二版本).高等出版社出版.2004年4月。</p><p> [5]胡學(xué)鋼.數(shù)據(jù)結(jié)構(gòu)(C語言版) .高等教育出版社.2004年8月。</p><p> [6]陳明編著.數(shù)據(jù)結(jié)構(gòu).北京:清華大學(xué)出版社,2005年。</p><p> [7]王紅梅,胡明,王濤編著(C++版)(第2版).清華大學(xué)出版社.2011年6月</p&g
溫馨提示
- 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è)計--二叉樹的相關(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è)計---二叉樹的遍歷算法集成
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----二叉樹的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉樹的遍歷算法分析與設(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ù)據(jù)結(jié)構(gòu)課程設(shè)計之-樹與二叉樹的轉(zhuǎn)換
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----二叉樹平衡的判定
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計之二叉樹的遍歷
評論
0/150
提交評論