版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p> 1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)任務(wù)書1</p><p><b> 1.1、題目1</b></p><p><b> 1.2、要求1</b></p><p><b> 2、總體設(shè)計(jì)1</
2、b></p><p> 2.1、功能模塊設(shè)計(jì)1</p><p> 2.2、所有功能模塊的流程圖2</p><p><b> 3、詳細(xì)設(shè)計(jì)2</b></p><p> 3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲(chǔ)結(jié)構(gòu)的說(shuō)明3</p><p> 3.2、算法的設(shè)計(jì)思想5</p&
3、gt;<p> 4、調(diào)試與測(cè)試:5</p><p> 4.1、調(diào)試方法與步驟:5</p><p> 4.2、測(cè)試結(jié)果的分析與討論:6</p><p> 4.3、測(cè)試過(guò)程中遇到的主要問(wèn)題及采取的解決措施:8</p><p> 5、時(shí)間復(fù)雜度的分析:9</p><p> 6、源程序清單和
4、執(zhí)行結(jié)果9</p><p> 7、C程序設(shè)計(jì)總結(jié)21</p><p><b> 8、致謝21</b></p><p><b> 9、參考文獻(xiàn)21</b></p><p> 1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)任務(wù)書</p><p><b> 1.1、題目</
5、b></p><p><b> 線索二叉樹(shù)</b></p><p><b> 1.2、要求</b></p><p> ?。?)建立中序線索二叉樹(shù),并且遍歷;</p><p> (2)求中序線索二叉樹(shù)上已知結(jié)點(diǎn)中序的前驅(qū)和后繼;</p><p> ?。?)插入結(jié)點(diǎn)到
6、指定位置,刪除指定結(jié)點(diǎn);</p><p> ?。?)求中序線索二叉樹(shù)上已知結(jié)點(diǎn)在先序下的后繼和后序下的前驅(qū);</p><p><b> 2、總體設(shè)計(jì)</b></p><p> 2.1、功能模塊設(shè)計(jì)</p><p> 根據(jù)課程設(shè)計(jì)題目的功能要求,各個(gè)功能模塊的組成框圖如下:</p><p>
7、 2.2、所有功能模塊的流程圖</p><p><b> 3、詳細(xì)設(shè)計(jì)</b></p><p> 3.1實(shí)現(xiàn)線索二叉樹(shù)的建立、插入、刪除、恢復(fù)線索的實(shí)現(xiàn).n個(gè)結(jié)點(diǎn)的二叉鏈表中含有n+1個(gè)空指針域。利用二叉鏈表中的空指針域,存放指向結(jié)點(diǎn)在某種遍歷次序下的前趨和后繼結(jié)點(diǎn)的指針(這種附加的指針?lè)Q為"線索")。這種加上了線索的二叉鏈表稱為線索鏈表,相應(yīng)
8、的二叉樹(shù)稱為線索二叉樹(shù)。 3.2 二叉樹(shù)的建立、插入、刪除、線索化:</p><p> 3.3、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲(chǔ)結(jié)構(gòu)的說(shuō)明</p><p> 3.3.1 線索二叉樹(shù)的結(jié)點(diǎn)的結(jié)構(gòu)如下:</p><p><b> 約定:</b></p>
9、;<p> Ltag=0 //表示lchild域指示該結(jié)點(diǎn)的左孩子</p><p> Ltag=1 //表示lchild域指示該結(jié)點(diǎn)的前驅(qū)</p><p> Rtag=0 //表示rchild域指示該結(jié)點(diǎn)的右孩子</p&g
10、t;<p> Rtag=1 //表示rchild域指示該結(jié)點(diǎn)的后繼 3.3.2線索鏈表中結(jié)點(diǎn)類型說(shuō)明:</p><p> Typedef char datatype;</p><p> Typedef struct node{</p><p> I
11、nt ltag,rtag;</p><p> Datatype data;</p><p> Struct node *lchild,*rchild;</p><p><b> }bithptr;</b></p><p> 3.3.3 線索化算法:</p><p> 結(jié)點(diǎn)*pre 是結(jié)點(diǎn)
12、*p的前驅(qū),而*p是*pre的后繼。這樣,當(dāng)遍歷到結(jié)點(diǎn)*p時(shí),可以進(jìn)行以下三步操作:</p><p> 1)若*p有空指針域,則將相應(yīng)的標(biāo)志置1.</p><p> 2)若*p的左線索標(biāo)志已經(jīng)建立(p->ltag=1),則可使其前驅(qū)線索化,令p->lchild=pre.</p><p> 3)若*pre的右線索標(biāo)志已經(jīng)建立(pre->rtag
13、=1),則可使其后繼線索化,令pre->rchild=p.</p><p> 如此,二叉樹(shù)的線索化可以在二叉樹(shù)的遍歷過(guò)程完成,該算法應(yīng)為相應(yīng)順序的遍歷算法的一種變化形式。</p><p> 3.3.4二叉鏈表的建立:</p><p><b> 其算法描述如下:</b></p><p> Bitree *cr
14、t_bt_pre(bitree *bt){</p><p><b> Char ch;</b></p><p> Ch=getchar( );</p><p> If(ch==‘#’)</p><p><b> Bt=null;</b></p><p><b&g
15、t; Else{</b></p><p> Bt=(bitree *)malloc(sizeof(bitree));</p><p> Bt->data=c;</p><p> Bt->lchild=crt_bt_pre(bt->lchild);</p><p> Bt->rchild=crt_b
16、t_pre(bt->rchild);</p><p><b> }</b></p><p> Return(bt);</p><p><b> }</b></p><p> 3.4、算法的設(shè)計(jì)思想</p><p><b> a) 二叉樹(shù)的性質(zhì)<
17、/b></p><p> ?、俣鏄?shù)的第i層上的結(jié)點(diǎn)數(shù)最多為2^i-1次方(i>=1)。</p><p> ?、谏疃葹镵的二叉樹(shù)至多有2^i-1個(gè)結(jié)點(diǎn)等。</p><p><b> b) 二叉樹(shù)的存儲(chǔ)</b></p><p><b> 順序存儲(chǔ)、鏈?zhǔn)酱鎯?chǔ)</b></p>
18、<p><b> C)二叉樹(shù)的遍歷</b></p><p><b> 前序遍歷二叉樹(shù)</b></p><p><b> 中序遍歷二叉樹(shù)</b></p><p><b> 后序遍歷二叉樹(shù)</b></p><p><b> d)
19、棧的性質(zhì)</b></p><p><b> 4、調(diào)試與測(cè)試:</b></p><p> 4.1、調(diào)試方法與步驟:</p><p> ⑴當(dāng)用二叉鏈表作為二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)時(shí)??梢苑奖愕卣业侥硞€(gè)結(jié)點(diǎn)的左右孩子,但一般情況下,無(wú)法直接摘到該結(jié)點(diǎn)在沒(méi)中遍歷序列中的前驅(qū)和后繼接待你。為了解決這個(gè)問(wèn)題,所以采用線索二叉樹(shù)。但是在編寫過(guò)程中,
20、忽略了線索二叉樹(shù)的改變,沒(méi)有改變空的左孩子指針域,而后再看了一遍數(shù)據(jù)結(jié)構(gòu)的相關(guān)指導(dǎo)教材,發(fā)現(xiàn)了錯(cuò)誤,及時(shí)改正,將空的左孩子指針域改為指向其前驅(qū)。</p><p> ⑵在進(jìn)行線索化的編寫過(guò)程中,出現(xiàn)了問(wèn)題。開(kāi)始只能對(duì)幾點(diǎn)進(jìn)行前驅(qū)線索化,而不能進(jìn)行后繼線索化。為此做了相應(yīng)調(diào)整:</p><p> ?、?若*p有空指針域,則將相應(yīng)的標(biāo)志置1。</p><p> ?、?若
21、*p的左線索標(biāo)志已經(jīng)建立,則可使其前驅(qū)線索化,令p->lchild=pre。</p><p> ③ 若*pre的右線索標(biāo)志已經(jīng)建立,則可使其后繼線索化,令pre->rchild=p。</p><p> ?、窃诰帉懼行蚓€索二叉樹(shù)中的后繼查找算法時(shí),只編寫了其中一種情況,應(yīng)該有兩種情況① *p的右子樹(shù)為空,則p->rchild為右線索,指向*p的后繼結(jié)點(diǎn)。</p>
22、;<p> ?、谌?p的右子樹(shù)非空,根據(jù)中序遍歷的順序,*p的后繼結(jié)點(diǎn)為其右子樹(shù)中最左下的結(jié)點(diǎn)。</p><p> 5、時(shí)間復(fù)雜度的分析</p><p> 線索二叉樹(shù)的時(shí)間復(fù)雜度不查過(guò)他的高度h</p><p><b> 6、測(cè)試結(jié)果</b></p><p> 如圖1所示,初始化輸入二叉樹(shù),實(shí)現(xiàn)線索
23、化,查看線索輸出與中序輸出:</p><p><b> 圖1</b></p><p> 如圖2所示,在b結(jié)點(diǎn)處插入結(jié)點(diǎn)w,恢復(fù)線索化,查看中序,線索輸出為:</p><p><b> 圖2</b></p><p> 如圖3所示,刪除結(jié)點(diǎn)e,恢復(fù)線索化,查看中序線索輸出為:</p>
24、<p><b> 圖3</b></p><p> 6.、測(cè)試過(guò)程中采取的解決措施:</p><p> <1>按先序次序遍歷先序線索二叉樹(shù)。</p><p> 這個(gè)主要是確定下一個(gè)結(jié)點(diǎn)的方法比較麻煩,需要考慮多種情況,并對(duì)它們進(jìn)行分別處理。其實(shí)在加入線索以后,可用判斷左右線索的標(biāo)記的方法來(lái)確定是否有孩子,然后還是
25、應(yīng)用遞歸調(diào)用的方法來(lái)遍歷。</p><p><b> 預(yù)期結(jié)果:</b></p><p> Full41.cbt:ABCDEFGHIJKLMN</p><p> Letter.cbt:abcdefghijklmnopqrstuvwxyz</p><p> <2>按中序次序遍歷中序線索二叉樹(shù)。</
26、p><p> 大致和先序遍歷二叉樹(shù)類似。</p><p><b> 預(yù)期結(jié)果:</b></p><p> Full41.cbt:ECEBGFHAKJLINMO</p><p> Letter.cbt:dfgeihjclkmbonpartsuqwxvyz</p><p> <3>將
27、值為x的結(jié)點(diǎn)作為先序線索二叉樹(shù)T的左子樹(shù)的(先序)最后一個(gè)結(jié)點(diǎn)的右孩子插入進(jìn)去。</p><p> 難點(diǎn)在于尋找結(jié)點(diǎn)和維護(hù)線索。應(yīng)該先創(chuàng)建X,然后再將X的前后線索從上一個(gè)結(jié)點(diǎn)中讀取,再改變結(jié)點(diǎn)的右孩子值,連接到X。</p><p> 預(yù)期結(jié)果(先序輸出):</p><p> Full41.cbt:ABCDEFGHXIJKLMNO</p><
28、p> Letter.cbt: abcdefghijklmnopXqrstuvwxyz</p><p> <4>按中序次序線索化二叉樹(shù)。</p><p> 使用遞歸遍歷樹(shù)的方法,使用一個(gè)類的私有成員記錄每次的前一個(gè)結(jié)點(diǎn),然后把當(dāng)前結(jié)點(diǎn)的前驅(qū)索引指向前一個(gè)結(jié)點(diǎn),前一個(gè)節(jié)點(diǎn)的后繼索引指向當(dāng)前結(jié)點(diǎn)。</p><p> <5>按后序次序線
29、索化二叉樹(shù)。</p><p> 與中序線索化二叉樹(shù)類似,只是要改變索引與遞歸調(diào)用的順序。</p><p> 6、源程序清單和執(zhí)行結(jié)果</p><p><b> (清單中有注釋)</b></p><p> #include <stdio.h> </p><p> #includ
30、e "malloc.h"</p><p> #include "windows.h"</p><p> #define maxsize 20 //規(guī)定樹(shù)中結(jié)點(diǎn)的最大數(shù)目</p><p> typedef struct node{
31、 //定義數(shù)據(jù)結(jié)構(gòu)</p><p> int ltag,rtag; //表示child域指示該結(jié)點(diǎn)是否孩子 </p><p> char data; //記錄結(jié)點(diǎn)的數(shù)據(jù)</p><p> struct node *lchild,*rchild
32、; //記錄左右孩子的指針</p><p> }Bithptr;</p><p> Bithptr *Q[maxsize]; //建隊(duì),保存已輸入的結(jié)點(diǎn)的地址</p><p> Bithptr *CreatTree(){ //建樹(shù)函數(shù),返回根
33、指針</p><p><b> char ch;</b></p><p> int front,rear;</p><p> Bithptr *T,*s;</p><p><b> T=NULL;</b></p><p> front=1;rear=0; //置空
34、二叉樹(shù)</p><p> printf(" ********************線索二叉樹(shù)操作系統(tǒng)*********************\n");</p><p> printf("進(jìn)行初始化,請(qǐng)依次輸入結(jié)點(diǎn)以#號(hào)結(jié)束\n");</p><p> ch=getchar();
35、 //輸入第一個(gè)字符</p><p> while(ch!='#') //判斷是否為結(jié)束字符</p><p><b> {</b></p><p><b> s=NULL;</b></p><p&
36、gt; if(ch!='@') //判斷是否為虛結(jié)點(diǎn)</p><p><b> {</b></p><p> s=(Bithptr *)malloc(sizeof(Bithptr));</p><p> s->data=ch;</p><p>
37、; s->lchild=NULL;</p><p> s->rchild=NULL;</p><p> s->rtag=0;</p><p> s->ltag=0;</p><p><b> }</b></p><p> rear++;
38、</p><p> Q[rear]=s; //將結(jié)點(diǎn)地址加入隊(duì)列中</p><p> if(rear==1)T=s; //輸入為第一個(gè)結(jié)點(diǎn)為根結(jié)點(diǎn)</p><p><b> else </b></p><p><
39、b> {</b></p><p> if(s!=NULL&&Q[front]!=NULL) //孩子和雙親結(jié)點(diǎn)均不是虛結(jié)點(diǎn)</p><p> if(rear%2==0)</p><p> Q[front]->lchild=s;</p><p> else Q[front]->
40、rchild=s;</p><p> if(rear%2==1)front++;</p><p><b> }</b></p><p> ch=getchar();</p><p><b> }</b></p><p><b> return T;<
41、/b></p><p><b> }</b></p><p> void Inorder(Bithptr *T) //中序遍歷</p><p><b> {</b></p><p><b> if(T)</b></p
42、><p><b> {</b></p><p> if(T->ltag!=1)Inorder(T->lchild);</p><p> printf("%c→",T->data);</p><p> if(T->rtag!=1)Inorder(T->rchild);&
43、lt;/p><p><b> }</b></p><p><b> }</b></p><p> Bithptr *pre=NULL;</p><p> void PreThread(Bithptr *root) //中序線索化算法,函數(shù)實(shí)現(xiàn)</p>
44、<p><b> {</b></p><p> Bithptr *p;</p><p><b> p=root;</b></p><p><b> if(p){</b></p><p> PreThread(p->lchild);//線索化左子樹(shù)
45、 </p><p> if(pre&&pre->rtag==1)pre->rchild=p; //前驅(qū)結(jié)點(diǎn)后繼線索化</p><p> if(p->lchild==NULL) </p><p><b> {</b></p>
46、<p> p->ltag=1;</p><p> p->lchild=pre;</p><p><b> }</b></p><p> if(p->rchild==NULL) //后繼結(jié)點(diǎn)前驅(qū)線索化</p><p> p->rtag=1;&l
47、t;/p><p><b> pre=p;</b></p><p> PreThread(p->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> void PrintIndex(Bi
48、thptr *t) //輸出線索</p><p><b> {</b></p><p> Bithptr *f;</p><p><b> f=t;</b></p><p><b> if(f)</b></p>
49、<p><b> {</b></p><p> if(f->ltag==1&&f->lchild==NULL&&f->rtag==1)</p><p> printf("【%c】",f->data); //如果是第一個(gè)結(jié)點(diǎn)</p><
50、p> if(f->ltag==1&&f->lchild!=NULL)</p><p> printf("%c→【%c】",f->lchild->data,f->data); //如果此結(jié)點(diǎn)有前驅(qū)就輸出前驅(qū)和此結(jié)點(diǎn)</p><p> if(f->ltag==1&&f->rtag=
51、=1&&f->rchild!=NULL)</p><p> printf("→%c",f->rchild->data); //如果此結(jié)點(diǎn)有前驅(qū)也有后繼,就輸出后繼</p><p> else if(f->rtag==1&&f->rchild!=NULL)</p><p>
52、; printf("【%c】→%c",f->data,f->rchild->data);//如果沒(méi)有前驅(qū),就輸出此結(jié)點(diǎn)和后繼</p><p> printf("\n");</p><p> if(f->ltag!=1)PrintIndex(f->lchild);</p><p> if(f
53、->rtag!=1)PrintIndex(f->rchild);</p><p><b> }</b></p><p><b> } </b></p><p> Bithptr *SearchChild(Bithptr *point,char findnode) //查找孩
54、子結(jié)點(diǎn)函數(shù)</p><p><b> {</b></p><p> Bithptr *point1,*point2;</p><p> if(point!=NULL)</p><p><b> {</b></p><p> if(point->data==fi
55、ndnode) return point;</p><p><b> else </b></p><p> if(point->ltag!=1) {point1=SearchChild(point->lchild,findnode);if(point1!=NULL)return point1;} </p><p&
56、gt; if(point->rtag!=1) {point2=SearchChild(point->rchild,findnode);if(point2!=NULL)return point2;} </p><p> return NULL; </p><p><b> }</b></p>
57、;<p><b> else </b></p><p> return NULL;</p><p><b> } </b></p><p> Bithptr *SearchPre(Bithptr *point,Bithptr *child) //查找父親結(jié)點(diǎn)函數(shù)</p>
58、;<p><b> {</b></p><p> Bithptr *point1,*point2;</p><p> if(point!=NULL)</p><p><b> {</b></p><p> if((point->ltag!=1&&poin
59、t->lchild==child)||(point->rtag!=1&&point->rchild==child)) return point;</p><p><b> else </b></p><p> if(point->ltag!=1) </p><p><b> {<
60、/b></p><p> point1=SearchPre(point->lchild,child);</p><p> if(point1!=NULL)</p><p> return point1;</p><p><b> } </b></p><p>
61、if(point->rtag!=1) </p><p><b> {</b></p><p> point2=SearchPre(point->rchild,child);</p><p> if(point2!=NULL)</p><p> return point2;</p><
62、;p> } </p><p> return NULL; </p><p><b> }</b></p><p><b> else </b></p><p> return NULL;</p><p><
63、;b> }</b></p><p> void Insert(Bithptr *root)</p><p><b> {</b></p><p><b> char ch;</b></p><p><b> char c;</b></p>
64、<p> Bithptr *p1,*child,*p2;</p><p> printf("請(qǐng)輸入要插入的結(jié)點(diǎn)的信息:");</p><p> scanf("%c",&c);</p><p> scanf("%c",&c);</p><p>
65、p1=(Bithptr *)malloc(sizeof(Bithptr)); //插入的結(jié)點(diǎn)信息</p><p> p1->data=c;</p><p> p1->lchild=NULL;</p><p> p1->rchild=NULL;</p><p> p1->rtag=0;</p&
66、gt;<p> p1->ltag=0;</p><p> printf("輸入插入結(jié)點(diǎn)的位置:");</p><p> scanf("%c",&ch);</p><p> scanf("%c",&ch);</p><p> child=S
67、earchChild(root,ch); //查孩子結(jié)點(diǎn)的地址</p><p> if(child==NULL){</p><p> printf("沒(méi)有找到結(jié)點(diǎn)\n");</p><p> system("pause");</p><p><b&g
68、t; return ;</b></p><p><b> }</b></p><p> else printf("發(fā)現(xiàn)結(jié)點(diǎn)%c\n",child->data);</p><p> if(child->ltag==0) //當(dāng)孩子結(jié)點(diǎn)有左孩子的時(shí)候<
69、/p><p><b> {</b></p><p><b> p2=child;</b></p><p> child=child->lchild;</p><p> while(child->rchild&&child->rtag==0)
70、 //找到左子樹(shù)下,最右結(jié)點(diǎn)</p><p> child=child->rchild;</p><p> printf("發(fā)現(xiàn)結(jié)點(diǎn)%c\n",child->data);</p><p> p1->rchild=child->rchild; //后繼化 </p><p>
71、 p1->rtag=1;</p><p> child->rtag=0;</p><p> child->rchild=p1; //連接 </p><p> p1->lchild=child; //前驅(qū)化</p><
72、;p> p1->ltag=1;</p><p><b> } </b></p><p> else //當(dāng)孩子結(jié)點(diǎn)沒(méi)有左孩子的時(shí)候</p><p><b> {</b></p><p> p1->lchild=ch
73、ild->lchild; //前驅(qū)化</p><p> child->ltag=0;</p><p> p1->ltag=1;</p><p> child->lchild=p1;</p><p> p1->rchild=child;</p><p> p1->rta
74、g=1;</p><p><b> }</b></p><p> printf("\n\t插入結(jié)點(diǎn)操作已經(jīng)完成,并同時(shí)完成了線索化的恢復(fù)\n");</p><p><b> }</b></p><p> Bithptr * DeleteNode(Bithptr *t)&l
75、t;/p><p><b> {</b></p><p> Bithptr *child,*pre,*s,*q;</p><p><b> char ch;</b></p><p> printf("輸入刪除的結(jié)點(diǎn)信息:");</p><p> ch=
76、getchar();</p><p> ch=getchar();</p><p> child=SearchChild(t,ch);</p><p> printf("發(fā)現(xiàn)結(jié)點(diǎn):%c\n",child->data);</p><p> printf("ltag=%d,rtag=%d\n"
77、,child->ltag,child->rtag);</p><p> pre=SearchPre(t,child);</p><p> if(NULL==child)</p><p><b> {</b></p><p> printf("沒(méi)有找到結(jié)點(diǎn):");</p>
78、<p><b> return t;</b></p><p><b> }</b></p><p> system("pause");</p><p> if(child==pre->lchild||child==pre) /
79、/是父親結(jié)點(diǎn)的左孩子</p><p><b> {</b></p><p> if(1==child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)無(wú)左右</p><p><b> {</b></p><p> pre->lchild=child-
80、>lchild;</p><p> pre->ltag=1;</p><p> if(child->lchild!=NULL)</p><p> if(child->lchild->rtag==1)child->lchild->rchild=pre;</p><p> free(child);
81、</p><p><b> }</b></p><p> else if(1!=child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)有左無(wú)右</p><p><b> {</b></p><p> pre->lchild=child->
82、;lchild;</p><p> s=child->lchild;</p><p> while(s->rchild)</p><p> s=s->rchild;</p><p> s->rchild=child->rchild;</p><p> free(child);&l
83、t;/p><p><b> }</b></p><p> else if(1==child->ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)有右無(wú)左</p><p><b> { </b></p><p> pre->lchild=child->
84、rchild;</p><p> s=child->rchild;</p><p> while(s->lchild)</p><p> s=s->lchild;</p><p> s->lchild=child->lchild;</p><p> if(child->lc
85、hild!=NULL)</p><p> if(child->lchild->rtag==1)child->lchild->rchild=pre;</p><p> free(child);</p><p><b> }</b></p><p> else if(1!=child->
86、ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)左右都有</p><p><b> {</b></p><p> pre->lchild=child->lchild;</p><p> s=child->rchild;</p><p> while(s->lch
87、ild)</p><p> s=s->lchild;</p><p> s->lchild=child->lchild->rchild;//把孩子結(jié)點(diǎn)的左孩子的右子樹(shù)接到孩子右子樹(shù)的最左下結(jié)點(diǎn)</p><p> if(child->lchild->rtag!=1)s->ltag=0;</p><p&
88、gt; q=child->lchild;</p><p> while(q->rchild)</p><p> q=q->rchild;</p><p> q->rchild=s;</p><p> child->lchild->rchild=child->rchild;</p>
89、<p> child->lchild->rtag=0;</p><p> free(child);</p><p><b> }</b></p><p><b> }</b></p><p> if(child==pre->rchild)
90、 //是父親結(jié)點(diǎn)的右孩子</p><p><b> {</b></p><p> if(1==child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)無(wú)左右</p><p><b> {</b></p><p> pre-
91、>rchild=child->rchild;</p><p> pre->rtag=1;</p><p> if(child->rchild!=NULL)</p><p> if(child->rchild->ltag==1)child->rchild->lchild=pre;</p><p&
92、gt; free(child);</p><p><b> }</b></p><p> else if(1!=child->ltag&&1==child->rtag)//孩子結(jié)點(diǎn)有左無(wú)右</p><p><b> {</b></p><p> pre->
93、rchild=child->lchild;</p><p> s=child->lchild;</p><p> while(s->rchild)</p><p> s=s->rchild;</p><p> s->rchild=child->rchild;</p><p>
94、 if(child->rchild!=NULL)</p><p> if(child->rchild->ltag==1)child->rchild->lchild=pre;</p><p> free(child);</p><p><b> }</b></p><p> else
95、 if(1==child->ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)有右無(wú)左</p><p><b> { </b></p><p> pre->rchild=child->rchild;</p><p> s=child->rchild;</p><p>
96、; while(s->lchild)</p><p> s=s->lchild;</p><p> s->lchild=child->lchild;</p><p> free(child);</p><p><b> }</b></p><p> else i
97、f(1!=child->ltag&&1!=child->rtag)//孩子結(jié)點(diǎn)左右都有</p><p> {/*pre->lchild=child->lchild;</p><p> s=child->rchild;</p><p> while(s->lchild)</p><p>
98、; s=s->lchild;</p><p> s->lchild=child->lchild->rchild;//把孩子結(jié)點(diǎn)的左孩子的右子樹(shù)接到孩子右子樹(shù)的最左下結(jié)點(diǎn)</p><p> if(child->lchild->rtag!=1)s->ltag=0;</p><p> q=child->lchild;
99、</p><p> while(q->rchild)</p><p> q=q->rchild;</p><p> q->rchild=s;</p><p> child->lchild->rchild=child->rchild;</p><p> child->l
100、child->rtag=0;*/</p><p> pre->rchild=child->rchild;</p><p> s=child->lchild;</p><p> while(s->rchild)</p><p> s=s->rchild;</p><p> s
101、->rchild=child->rchild->lchild;//把孩子結(jié)點(diǎn)的左孩子的右子樹(shù)接到孩子右子樹(shù)的最右下結(jié)點(diǎn)</p><p> if(child->rchild->ltag!=1)s->rtag=0;</p><p> q=child->rchild;</p><p> while(q->lchild)
102、</p><p> q=q->lchild;</p><p> q->lchild=s;</p><p> child->rchild->lchild=child->lchild;</p><p> child->rchild->ltag=0;</p><p> fr
103、ee(child);</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n\t插入結(jié)點(diǎn)操作已經(jīng)完成,并同時(shí)完成了線索化的恢復(fù)\n");</p><p> printf(" %c",child
104、->data);</p><p><b> return t;</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> Bithptr *T;<
105、;/p><p><b> int i;</b></p><p> //system("color 1a");</p><p> T=CreatTree();</p><p> printf("\n");</p><p><b> i=1;&l
106、t;/b></p><p><b> while(i)</b></p><p><b> {</b></p><p> printf("\t1 進(jìn)行二叉樹(shù)線索化\n");</p><p> printf("\t2 進(jìn)行插入操作\n");</
107、p><p> printf("\t3 進(jìn)入刪除操作\n");</p><p> printf("\t4 中序輸出\n");</p><p> printf("\t5 線索輸出\n");</p><p> printf("\t0 退出\n");</p>
108、;<p> printf("\t 請(qǐng)選擇:");</p><p> scanf("%d",&i);</p><p> printf("\n");</p><p><b> switch(i)</b></p><p><b&g
109、t; {</b></p><p> case 1:PreThread(T);</p><p> printf("\t已經(jīng)實(shí)現(xiàn)二叉樹(shù)的線索化\n");</p><p> printf("\n");</p><p><b> break;</b></p>
110、;<p> case 2:Insert(T);printf("\n");break;</p><p> case 3:T=DeleteNode(T);printf("\n");break;</p><p> case 4:Inorder(T);</p><p> printf("\n"
111、);</p><p><b> break;</b></p><p> case 5:PrintIndex(T);break;</p><p> case 0:exit(1);</p><p> default:printf("error\n\t請(qǐng)繼續(xù)選擇:\n"); </p&
112、gt;<p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p><b> 7、C程序設(shè)計(jì)總結(jié)</b></p><p> 本題實(shí)現(xiàn)了對(duì)二叉樹(shù)的先序、中序、后序遍歷和線索
113、化過(guò)程,在設(shè)計(jì)過(guò)程中要對(duì)同一個(gè)二叉樹(shù)同時(shí)實(shí)現(xiàn)先序、中序、和后序線索化,則應(yīng)該在其一次線索化后還原并重新進(jìn)行線索化并輸出,這一過(guò)程較為復(fù)雜,為了實(shí)現(xiàn)這一功能,我參考了網(wǎng)絡(luò)上的很多代碼,雖然實(shí)現(xiàn)了我要的效果,但自己始終對(duì)這一模塊了解的不是很透徹,經(jīng)過(guò)課程設(shè)計(jì),讓我對(duì)自己的編程能力有了大概的摸底,以后我會(huì)在語(yǔ)言的熟練程度上加強(qiáng),提高C語(yǔ)言的駕馭能力,最終熟練掌握C語(yǔ)言的各種操作。</p><p><b>
114、8、致謝</b></p><p> 能夠完成這次課程設(shè)計(jì)必須感謝xx同學(xué)(他們幫我修改了幾處重要錯(cuò)誤,同時(shí)啟發(fā)我完善了該程序的功能)。</p><p><b> 9、參考文獻(xiàn)</b></p><p> [1] 賈宗璞、許合利,C語(yǔ)言程序設(shè)計(jì),江蘇:中國(guó)礦業(yè)大學(xué)出版社,2007.6</p><p> [
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹(shù)》課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---線索二叉樹(shù)的生成及其遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--二叉樹(shù)的算法
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)--線索二叉樹(shù)的基本操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---計(jì)算二叉樹(shù)高度
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)及應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹(shù)的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉樹(shù)的操作
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--二叉排序樹(shù)調(diào)整為平衡二叉樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)的相關(guān)操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹(shù)平衡的判定
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--按層次遍歷二叉樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-二叉樹(shù)的基本操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之二叉樹(shù)的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)生成家譜
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之-樹(shù)與二叉樹(shù)的轉(zhuǎn)換
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉樹(shù)的遍歷算法集成
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉排序樹(shù)和平衡二叉樹(shù)的判別
評(píng)論
0/150
提交評(píng)論