• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-145  評(píng)論-173  文章-70  trackbacks-0
            二叉樹(shù)的實(shí)驗(yàn)操作:
            題目如下:
            1.設(shè)某二叉樹(shù)的結(jié)點(diǎn)類(lèi)型為整數(shù)類(lèi)型,以二叉鏈表形式作為存儲(chǔ)結(jié)構(gòu)。試編程實(shí)現(xiàn):
            (1) 生成一棵二叉樹(shù).
            (2) 用遞歸算法、非遞歸算法實(shí)現(xiàn)二叉樹(shù)的遍歷;
            (3) 求度分別為0、1、2的結(jié)點(diǎn)的數(shù)目,分別用遞歸算法、非遞歸算法實(shí)現(xiàn);
            (4) 按層次遍歷二叉樹(shù)(提示:使用一個(gè)隊(duì)列實(shí)現(xiàn));
            *(5) 求二叉樹(shù)的高度(深度);
            *(6) 判斷是否為完全二叉樹(shù),輸出'Yes!'/'No!';
            *(7) 交換每個(gè)結(jié)點(diǎn)的左右子樹(shù);
            *(8) 對(duì)交換左右子樹(shù)后的二叉樹(shù)作中序遍歷。
            #include<stdio.h>
            #include<conio.h>
            #include<stdlib.h>
            #include<string.h>
            #define ERROR  0
            #define OK  1
            #define OVERFLOW -2
            #define queuesize 20
            typedef struct BiTNode{
                int data;
                struct BiTNode *lchild,*rchild; //左右孩子指針
            }BiTNode,*BiTree;
            typedef struct Queue{
                 int front ,rear ;
                 BiTree data[queuesize]; //循環(huán)隊(duì)列元素類(lèi)型為二叉鏈表結(jié)點(diǎn)指針
                 int count;
            }Queue; //循環(huán)隊(duì)列結(jié)構(gòu)定義

            int CreateBiTree(BiTree * T) { //聲明的就是一個(gè)BiTree類(lèi)型的指針,通過(guò)修改來(lái)對(duì)main中的T做修改,然后使其指向根結(jié)點(diǎn)
              // 按先序次序輸入二叉樹(shù)中結(jié)點(diǎn)的值(一個(gè)字符),空格字符表示空樹(shù),
              // 構(gòu)造二叉鏈表表示的二叉樹(shù)T。
              int ch;
              printf("請(qǐng)輸入一個(gè)根結(jié)點(diǎn)的值(如果為空,則輸入0)\n");
              scanf("%d",&ch);
              if (ch==0) (*T)= NULL;
              else {
                if (!(*T = (BiTNode *)malloc(sizeof(BiTNode))))  return ERROR;
                (*T)->data = ch;              // 生成根結(jié)點(diǎn)
                CreateBiTree(&(*T)->lchild);   // 構(gòu)造左子樹(shù)
                CreateBiTree(&(*T)->rchild);   // 構(gòu)造右子樹(shù)
              }
              return OK;
            } // CreateBiTree

            int PreOrderTraverse(BiTree T) //用遞歸算法寫(xiě)的遍歷函數(shù),按照先序遍歷,同時(shí)輸出結(jié)點(diǎn)的值
            {
                if(T!=NULL)
                {
                    printf("%d  ",T->data);
                    PreOrderTraverse(T->lchild);
                    PreOrderTraverse(T->rchild);
                }
                return OK;
            }

            int InorderTraverse(BiTree T)
            {
                if(T!=NULL)
                {
                    InorderTraverse(T->lchild);
                    printf("%d ",T->data);
                    InorderTraverse(T->rchild);
                }
                return OK;
            }
            int PreOrderTraverse2(BiTree T)  //用非遞歸的算法寫(xiě)的遍歷函數(shù),按照先序遍歷,同時(shí)輸出結(jié)點(diǎn)的值
            {
               BiTree p,s[20];
               int top=0;
               p=T;
               while((p!=NULL)||(top>0))
               {
                   while(p!=NULL)
                   {
                       printf("%d ",p->data);
                       s[++top]=p;
                       p=p->lchild;
                   }
                   p=s[top--];
                   p=p->rchild;
               }
               return OK;
            }

            int get_all_node(BiTree T)  //求出總的結(jié)點(diǎn)的個(gè)數(shù)
            {
               BiTree p,s[20];
               int num_node=0;
               int top=0;
               p=T;
               while((p!=NULL)||(top>0))
               {
                   while(p!=NULL)
                   {
                       num_node++;
                       s[++top]=p;
                       p=p->lchild;
                   }
                   p=s[top--];
                   p=p->rchild;
               }
               return num_node;
            }

            int get_node0_1(BiTree T)//利用遞歸算法得到度為0的結(jié)點(diǎn)的個(gè)數(shù)
            {
                int num1,num2;
                if(T==NULL)
                    return 0;
                else
                {
                    if((T->lchild==NULL)&&(T->rchild==NULL))
                        return 1;
                    else
                    {
                        num1=get_node0_1(T->lchild);
                        num2=get_node0_1(T->rchild);
                        return (num1+num2);
                    }
                }
            }
            int get_node0_2(BiTree T) //利用非遞歸算法,同時(shí)采用層次遍歷的方法,得到度為0的結(jié)點(diǎn)  
            {
                 Queue *q;
                 BiTree p=T;
                 int num=0;
                 q=(Queue *)malloc(sizeof(Queue));
                 q->front=0;
                 q->rear=0;
                 q->data[q->rear]=p;
                 q->rear++;
                 while(q->front < q->rear)
                 {
                     p=q->data[q->front];
                     q->front++;
                     if(p->lchild==NULL && p->rchild==NULL)
                     {
                         num++;
                     }
                     if(p->lchild!=NULL)
                     {
                         q->data[q->rear]=p->lchild;
                         q->rear++;
                     }
                     if(p->rchild!=NULL)
                     {
                         q->data[q->rear]=p->rchild;
                         q->rear++;
                     }
                 }
                return num;
            }

            int get_node1(BiTree T) //利用總的關(guān)系求出度為1的結(jié)點(diǎn)的個(gè)數(shù)
            {
                int num=get_all_node(T)-2*get_node0_1(T)+1;
                return num;
            }
            int get_node1_1(BiTree T)   //非遞歸算法,同時(shí)利用關(guān)系求度為1的結(jié)點(diǎn)。
            {
                int num=get_all_node(T)-2*get_node0_2(T)+1;
                return num;
            }
            int get_node2(BiTree T) //利用度為2的結(jié)點(diǎn)個(gè)數(shù)與度為0的結(jié)點(diǎn)個(gè)數(shù)的關(guān)系得到
            {
                int num=get_node0_1(T)-1;
                return num;
            }
            int get_node2_1(BiTree T)   //非遞歸算法,同時(shí)利用關(guān)系求度為2的結(jié)點(diǎn)。
            {
                int num=get_node0_2(T)-1;
                return num;
            }
            int get_node(BiTree T)
            {
                int get;
               printf("請(qǐng)輸入你要查找的結(jié)點(diǎn)的度\n");
               printf("1.查詢度為0的所有結(jié)點(diǎn)的個(gè)數(shù)\n");
               printf("2.查詢度為1的所有結(jié)點(diǎn)的個(gè)數(shù)\n");
               printf("3.查詢度為2的所有結(jié)點(diǎn)的個(gè)數(shù)\n");
               scanf("%d",&get);
               switch(get){
               case 1:
                  printf("度為0的所有結(jié)點(diǎn)的個(gè)數(shù)是%d\n",get_node0_1(T));
                  break;
               case 2:
                   printf("度為1的所有結(jié)點(diǎn)的個(gè)數(shù)是%d\n",get_node1(T));
                   break;
               case 3:
                   printf("度為2的所有結(jié)點(diǎn)的個(gè)數(shù)是%d\n",get_node2(T));
                   break;
               }
               return OK;
            }
            int get_node_1(BiTree T)        //利用非遞歸算法的實(shí)現(xiàn)
            {
                int get;
                printf("下面是用非遞歸算法來(lái)查詢\n");
               printf("請(qǐng)輸入你要查找的結(jié)點(diǎn)的度\n");
               printf("1.查詢度為0的所有結(jié)點(diǎn)的個(gè)數(shù)\n");
               printf("2.查詢度為1的所有結(jié)點(diǎn)的個(gè)數(shù)\n");
               printf("3.查詢度為2的所有結(jié)點(diǎn)的個(gè)數(shù)\n");
               scanf("%d",&get);
               switch(get){
               case 1:
                  printf("度為0的所有結(jié)點(diǎn)的個(gè)數(shù)是%d\n",get_node0_2(T));
                  break;
               case 2:
                   printf("度為1的所有結(jié)點(diǎn)的個(gè)數(shù)是%d\n",get_node1_1(T));
                   break;
               case 3:
                   printf("度為2的所有結(jié)點(diǎn)的個(gè)數(shù)是%d\n",get_node2_1(T));
                   break;
               }
               return OK;
            }
            int LevelOrder(BiTree T)
               Queue *q;
                 BiTree p;
                 int flag=0;                      //定義flag為層號(hào)
                 q=(Queue *)malloc(sizeof(Queue));  //申請(qǐng)循環(huán)隊(duì)列空間
                 q->rear=q->front=q->count=0;      //將循環(huán)隊(duì)列初始化為空
                 q->data[q->rear]=T;
                 q->count++;
                 q->rear=(q->rear+1)%queuesize;       //將根結(jié)點(diǎn)入隊(duì)
                 while (q->count)                   //若隊(duì)列不為空,做以下操作
                     if(q->data[q->front]){            //當(dāng)隊(duì)首元素不為空指針,做以下操作
                         p=q->data[q->front];           //取隊(duì)首元素*p
                         printf("%d ",p->data);        //打印*p結(jié)點(diǎn)的數(shù)據(jù)域信息
                         ++flag;
                         q->front=(q->front+1)%queuesize;
                         q->count--;       //隊(duì)首元素出隊(duì)
                         if (q->count==queuesize)//若隊(duì)列為隊(duì)滿,則打印隊(duì)滿信息,退出程序的執(zhí)行
                             printf("the queue full!\n");
                         else{            //若隊(duì)列不滿,將*p結(jié)點(diǎn)的左孩子指針入隊(duì)
                             q->count++;q->data[q->rear]=p->lchild;
                             q->rear=(q->rear+1)%queuesize;
                                               //enf of if
                         if (q->count==queuesize)        //若隊(duì)列為隊(duì)滿,則打印隊(duì)滿信息,退出程序的執(zhí)行
                             printf("the queue full!\n");
                         else{                      //若隊(duì)列不滿,將*p結(jié)點(diǎn)的右孩子指針入隊(duì)
                             q->count++;q->data[q->rear]=p->rchild;
                             q->rear=(q->rear+1)%queuesize;
                                                     //end of if
                                                   //end of if
                     else{                          //當(dāng)隊(duì)首元素為空指針,將空指針出隊(duì)
                         q->front=(q->front+1)%queuesize;
                         q->count--;
                     }
                     printf("\n");
                     return OK;
                 //end of LevelOrder

            int height(BiTree T)
            {
                BiTree p=T;
                int a,b;
                if(p==NULL)
                    return 0;
                else{
                   if((p->lchild==NULL)&&(p->rchild==NULL))
                        return 1;
                else{
                      a=height(p->rchild);
                      b=height(p->lchild);
                      if(a>b)   return (a+1);
                      else    return (b+1);
                      }
                }
            }

            int judge(BiTree T)   //采用遞歸算法來(lái)實(shí)現(xiàn)判斷是否為完全二叉樹(shù)
            {
                  if(T ==NULL)  
                      return   0;  
                  if(T->lchild == NULL && T->rchild== NULL)  
                      return   1;   
                  if(T->lchild  == NULL  && T->rchild != NULL||T->lchild!=NULL &&T->rchild==NULL)  
                      return   0;  
                  return   judge(T->lchild) & judge(T->rchild);  

            }

            int exchange(BiTree T)
            {
                 BiTree p=T;
                 int exch;
                 if(p==NULL)
                     return OK;
                 else
                 {
                     if(p->lchild!=NULL && p->rchild!=NULL)
                     {
                         exch=p->lchild->data;
                         p->lchild->data=p->rchild->data;
                         p->rchild->data=exch;
                         exchange(p->lchild);
                         exchange(p->rchild);
                     }
                     else
                     {
                         if(p->lchild==NULL)
                             exchange(p->rchild);
                         else
                             exchange(p->lchild);
                     }
                     return OK;
                 }
            }

            void main()
            {
                BiTree T;         //定義一個(gè)指向BiTNode結(jié)點(diǎn)的指針
                int choice;
                do{
                printf("\n");
                printf("請(qǐng)選擇操作:\n");
                printf("1.按照先序的次序生成一顆二叉樹(shù)\n");
                printf("2.遞歸算法實(shí)現(xiàn)二叉樹(shù)的先序遍歷,輸出各結(jié)點(diǎn)值\n");
                printf("3.用非遞歸算法實(shí)現(xiàn)二叉樹(shù)的遍歷,輸出各結(jié)點(diǎn)值\n");
                printf("4.求度分別為0、1、2的結(jié)點(diǎn)的數(shù)目(遞歸算法實(shí)現(xiàn))\n");
                printf("5.求度分別為0、1、2的結(jié)點(diǎn)的數(shù)目(非遞歸算法實(shí)現(xiàn))\n");
                printf("6.按層次遍歷二叉樹(shù)\n");
                printf("7.求二叉樹(shù)的高度(深度)\n");
                printf("8.判斷是否為完全二叉樹(shù),輸出\"Yes!\"或\"No!\"\n");
                printf("9.交換每個(gè)結(jié)點(diǎn)的左右子樹(shù),并用先序遍歷的方式輸出\n");
                printf("10.對(duì)交換左右子樹(shù)后的二叉樹(shù)作中序遍歷\n");
                printf("11.退出\n");
                scanf("%d",&choice);
                switch(choice){
                case 1:
                    CreateBiTree(&T);   //創(chuàng)建二叉樹(shù)
                    break;
                case 2:
                    PreOrderTraverse(T); //利用遞歸算法的先序遍歷,輸出結(jié)點(diǎn)值
                    break;
                case 3:
                    PreOrderTraverse2(T);//利用非遞歸算法的先序遍歷,輸出結(jié)點(diǎn)值
                    break;
                case 4:
                    get_node(T); //利用遞歸算法得到的各個(gè)結(jié)點(diǎn)的個(gè)數(shù)
                    break;
                case 5:
                    get_node_1(T);  //利用非遞歸算法得到的各個(gè)結(jié)點(diǎn)的個(gè)數(shù)
                    break;
                case 6:
                    LevelOrder(T);
                    break;
                case 7:
                    printf("二叉樹(shù)的高度為%d\n",height(T));
                    break;
                case 8:
                    if(judge(T)==0)
                        printf("No\n");
                    else
                        printf("Yes\n");
                    break;
                case 9:
                     exchange(T);
                     PreOrderTraverse(T);
                     break;
                case 10:
                     InorderTraverse(T);
                     break;
                   
                }while(choice!=11);    
            }

            注記:原來(lái)的那個(gè)函數(shù)5有問(wèn)題,即利用非遞歸算法求葉子結(jié)點(diǎn)的個(gè)數(shù)。
            posted on 2009-11-27 21:48 deercoder 閱讀(371) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 數(shù)據(jù)結(jié)構(gòu)和算法分析
            一级做a爰片久久毛片16| 亚洲国产成人久久综合区| 超级97碰碰碰碰久久久久最新| 中文字幕精品久久久久人妻| 思思久久99热只有频精品66| 波多野结衣AV无码久久一区| 97久久精品无码一区二区| 久久精品国产精品亜洲毛片| 亚洲中文久久精品无码| 久久精品免费观看| 久久国语露脸国产精品电影 | 久久噜噜久久久精品66| 性做久久久久久久久浪潮| 久久精品成人国产午夜| 久久婷婷人人澡人人爽人人爱| 久久青青草原精品影院| 无码人妻久久一区二区三区蜜桃| 久久国产精品99精品国产987| 色婷婷噜噜久久国产精品12p | 久久狠狠高潮亚洲精品 | 亚洲精品白浆高清久久久久久 | 国产激情久久久久影院小草| 国产69精品久久久久观看软件| 久久国产精品久久国产精品| 亚洲精品无码久久久久久| 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品国产亚洲av瑜伽| 久久精品无码一区二区无码 | AV无码久久久久不卡蜜桃| 久久久中文字幕日本| 久久亚洲精品中文字幕三区| 欧洲成人午夜精品无码区久久| 性做久久久久久免费观看| 久久人人爽人人爽人人片AV麻豆 | 日本亚洲色大成网站WWW久久| 久久久久久久综合日本亚洲| 久久精品国产亚洲AV电影 | 久久精品国产黑森林| 激情五月综合综合久久69| 色综合久久中文色婷婷| 伊人久久综合热线大杳蕉下载|