2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩21頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論