數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---線索二叉樹_第1頁
已閱讀1頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  目 錄</b></p><p>  1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計任務(wù)書1</p><p><b>  1.1、題目1</b></p><p><b>  1.2、要求1</b></p><p><b>  2、總體設(shè)計1</

2、b></p><p>  2.1、功能模塊設(shè)計1</p><p>  2.2、所有功能模塊的流程圖2</p><p><b>  3、詳細(xì)設(shè)計2</b></p><p>  3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲結(jié)構(gòu)的說明3</p><p>  3.2、算法的設(shè)計思想5</p&

3、gt;<p>  4、調(diào)試與測試:5</p><p>  4.1、調(diào)試方法與步驟:5</p><p>  4.2、測試結(jié)果的分析與討論:6</p><p>  4.3、測試過程中遇到的主要問題及采取的解決措施:8</p><p>  5、時間復(fù)雜度的分析:9</p><p>  6、源程序清單和

4、執(zhí)行結(jié)果9</p><p>  7、C程序設(shè)計總結(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è)計任務(wù)書</p><p><b>  1.1、題目</

5、b></p><p><b>  線索二叉樹</b></p><p><b>  1.2、要求</b></p><p>  (1)建立中序線索二叉樹,并且遍歷;</p><p> ?。?)求中序線索二叉樹上已知結(jié)點(diǎn)中序的前驅(qū)和后繼;</p><p> ?。?)插入結(jié)點(diǎn)到

6、指定位置,刪除指定結(jié)點(diǎn);</p><p> ?。?)求中序線索二叉樹上已知結(jié)點(diǎn)在先序下的后繼和后序下的前驅(qū);</p><p><b>  2、總體設(shè)計</b></p><p>  2.1、功能模塊設(shè)計</p><p>  根據(jù)課程設(shè)計題目的功能要求,各個功能模塊的組成框圖如下:</p><p> 

7、 2.2、所有功能模塊的流程圖</p><p><b>  3、詳細(xì)設(shè)計</b></p><p>  3.1實(shí)現(xiàn)線索二叉樹的建立、插入、刪除、恢復(fù)線索的實(shí)現(xiàn).n個結(jié)點(diǎn)的二叉鏈表中含有n+1個空指針域。利用二叉鏈表中的空指針域,存放指向結(jié)點(diǎn)在某種遍歷次序下的前趨和后繼結(jié)點(diǎn)的指針(這種附加的指針稱為"線索")。這種加上了線索的二叉鏈表稱為線索鏈表,相應(yīng)

8、的二叉樹稱為線索二叉樹。 3.2 二叉樹的建立、插入、刪除、線索化:</p><p>  3.3、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲結(jié)構(gòu)的說明</p><p>  3.3.1 線索二叉樹的結(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)類型說明:</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時,可以進(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>  如此,二叉樹的線索化可以在二叉樹的遍歷過程完成,該算法應(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è)計思想</p><p><b>  a) 二叉樹的性質(zhì)<

17、/b></p><p> ?、俣鏄涞牡趇層上的結(jié)點(diǎn)數(shù)最多為2^i-1次方(i>=1)。</p><p>  ②深度為K的二叉樹至多有2^i-1個結(jié)點(diǎn)等。</p><p><b>  b) 二叉樹的存儲</b></p><p><b>  順序存儲、鏈?zhǔn)酱鎯?lt;/b></p>

18、<p><b>  C)二叉樹的遍歷</b></p><p><b>  前序遍歷二叉樹</b></p><p><b>  中序遍歷二叉樹</b></p><p><b>  后序遍歷二叉樹</b></p><p><b>  d)

19、棧的性質(zhì)</b></p><p><b>  4、調(diào)試與測試:</b></p><p>  4.1、調(diào)試方法與步驟:</p><p> ?、女?dāng)用二叉鏈表作為二叉樹的存儲結(jié)構(gòu)時??梢苑奖愕卣业侥硞€結(jié)點(diǎn)的左右孩子,但一般情況下,無法直接摘到該結(jié)點(diǎn)在沒中遍歷序列中的前驅(qū)和后繼接待你。為了解決這個問題,所以采用線索二叉樹。但是在編寫過程中,

20、忽略了線索二叉樹的改變,沒有改變空的左孩子指針域,而后再看了一遍數(shù)據(jù)結(jié)構(gòu)的相關(guān)指導(dǎo)教材,發(fā)現(xiàn)了錯誤,及時改正,將空的左孩子指針域改為指向其前驅(qū)。</p><p> ?、圃谶M(jìn)行線索化的編寫過程中,出現(xiàn)了問題。開始只能對幾點(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>  ⑶在編寫中序線索二叉樹中的后繼查找算法時,只編寫了其中一種情況,應(yīng)該有兩種情況① *p的右子樹為空,則p->rchild為右線索,指向*p的后繼結(jié)點(diǎn)。</p>

22、;<p> ?、谌?p的右子樹非空,根據(jù)中序遍歷的順序,*p的后繼結(jié)點(diǎn)為其右子樹中最左下的結(jié)點(diǎn)。</p><p>  5、時間復(fù)雜度的分析</p><p>  線索二叉樹的時間復(fù)雜度不查過他的高度h</p><p><b>  6、測試結(jié)果</b></p><p>  如圖1所示,初始化輸入二叉樹,實(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.、測試過程中采取的解決措施:</p><p>  <1>按先序次序遍歷先序線索二叉樹。</p><p>  這個主要是確定下一個結(jié)點(diǎn)的方法比較麻煩,需要考慮多種情況,并對它們進(jìn)行分別處理。其實(shí)在加入線索以后,可用判斷左右線索的標(biāo)記的方法來確定是否有孩子,然后還是

25、應(yīng)用遞歸調(diào)用的方法來遍歷。</p><p><b>  預(yù)期結(jié)果:</b></p><p>  Full41.cbt:ABCDEFGHIJKLMN</p><p>  Letter.cbt:abcdefghijklmnopqrstuvwxyz</p><p>  <2>按中序次序遍歷中序線索二叉樹。</

26、p><p>  大致和先序遍歷二叉樹類似。</p><p><b>  預(yù)期結(jié)果:</b></p><p>  Full41.cbt:ECEBGFHAKJLINMO</p><p>  Letter.cbt:dfgeihjclkmbonpartsuqwxvyz</p><p>  <3>將

27、值為x的結(jié)點(diǎn)作為先序線索二叉樹T的左子樹的(先序)最后一個結(jié)點(diǎn)的右孩子插入進(jìn)去。</p><p>  難點(diǎn)在于尋找結(jié)點(diǎn)和維護(hù)線索。應(yīng)該先創(chuàng)建X,然后再將X的前后線索從上一個結(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>按中序次序線索化二叉樹。</p><p>  使用遞歸遍歷樹的方法,使用一個類的私有成員記錄每次的前一個結(jié)點(diǎn),然后把當(dāng)前結(jié)點(diǎn)的前驅(qū)索引指向前一個結(jié)點(diǎn),前一個節(jié)點(diǎn)的后繼索引指向當(dāng)前結(jié)點(diǎn)。</p><p>  <5>按后序次序線

29、索化二叉樹。</p><p>  與中序線索化二叉樹類似,只是要改變索引與遞歸調(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ī)定樹中結(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]; //建隊,保存已輸入的結(jié)點(diǎn)的地址</p><p>  Bithptr *CreatTree(){ //建樹函數(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、二叉樹</p><p>  printf(" ********************線索二叉樹操作系統(tǒng)*********************\n");</p><p>  printf("進(jìn)行初始化,請依次輸入結(jié)點(diǎn)以#號結(jié)束\n");</p><p>  ch=getchar();

35、 //輸入第一個字符</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)地址加入隊列中</p><p>  if(rear==1)T=s; //輸入為第一個結(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);//線索化左子樹

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); //如果是第一個結(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);//如果沒有前驅(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("請輸入要插入的結(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("沒有找到結(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)有左孩子的時候<

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、 //找到左子樹下,最右結(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)沒有左孩子的時候</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)完成,并同時完成了線索化的恢復(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("沒有找到結(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)無左右</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)有左無右</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)有右無左</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)的左孩子的右子樹接到孩子右子樹的最左下結(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)無左右</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)有左無右</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)有右無左</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)的左孩子的右子樹接到孩子右子樹的最左下結(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)的左孩子的右子樹接到孩子右子樹的最右下結(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)完成,并同時完成了線索化的恢復(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)行二叉樹線索化\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 請選擇:");</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)二叉樹的線索化\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請繼續(xù)選擇:\n"); </p&

112、gt;<p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  7、C程序設(shè)計總結(jié)</b></p><p>  本題實(shí)現(xiàn)了對二叉樹的先序、中序、后序遍歷和線索

113、化過程,在設(shè)計過程中要對同一個二叉樹同時實(shí)現(xiàn)先序、中序、和后序線索化,則應(yīng)該在其一次線索化后還原并重新進(jìn)行線索化并輸出,這一過程較為復(fù)雜,為了實(shí)現(xiàn)這一功能,我參考了網(wǎng)絡(luò)上的很多代碼,雖然實(shí)現(xiàn)了我要的效果,但自己始終對這一模塊了解的不是很透徹,經(jīng)過課程設(shè)計,讓我對自己的編程能力有了大概的摸底,以后我會在語言的熟練程度上加強(qiáng),提高C語言的駕馭能力,最終熟練掌握C語言的各種操作。</p><p><b>  

114、8、致謝</b></p><p>  能夠完成這次課程設(shè)計必須感謝xx同學(xué)(他們幫我修改了幾處重要錯誤,同時啟發(fā)我完善了該程序的功能)。</p><p><b>  9、參考文獻(xiàn)</b></p><p>  [1] 賈宗璞、許合利,C語言程序設(shè)計,江蘇:中國礦業(yè)大學(xué)出版社,2007.6</p><p>  [

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論