• <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í)驗(yàn)操作:
            題目如下:
            1.設(shè)某二叉樹的結(jié)點(diǎn)類型為整數(shù)類型,以二叉鏈表形式作為存儲(chǔ)結(jié)構(gòu)。試編程實(shí)現(xiàn):
            (1) 生成一棵二叉樹.
            (2) 用遞歸算法、非遞歸算法實(shí)現(xiàn)二叉樹的遍歷;
            (3) 求度分別為0、1、2的結(jié)點(diǎn)的數(shù)目,分別用遞歸算法、非遞歸算法實(shí)現(xiàn);
            (4) 按層次遍歷二叉樹(提示:使用一個(gè)隊(duì)列實(shí)現(xiàn));
            *(5) 求二叉樹的高度(深度);
            *(6) 判斷是否為完全二叉樹,輸出'Yes!'/'No!';
            *(7) 交換每個(gè)結(jié)點(diǎn)的左右子樹;
            *(8) 對(duì)交換左右子樹后的二叉樹作中序遍歷。
            #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ì)列元素類型為二叉鏈表結(jié)點(diǎn)指針
                 int count;
            }Queue; //循環(huán)隊(duì)列結(jié)構(gòu)定義

            int CreateBiTree(BiTree * T) { //聲明的就是一個(gè)BiTree類型的指針,通過修改來對(duì)main中的T做修改,然后使其指向根結(jié)點(diǎn)
              // 按先序次序輸入二叉樹中結(jié)點(diǎn)的值(一個(gè)字符),空格字符表示空樹,
              // 構(gòu)造二叉鏈表表示的二叉樹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)造左子樹
                CreateBiTree(&(*T)->rchild);   // 構(gòu)造右子樹
              }
              return OK;
            } // CreateBiTree

            int PreOrderTraverse(BiTree T) //用遞歸算法寫的遍歷函數(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)  //用非遞歸的算法寫的遍歷函數(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("下面是用非遞歸算法來查詢\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)   //采用遞歸算法來實(shí)現(xiàn)判斷是否為完全二叉樹
            {
                  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.按照先序的次序生成一顆二叉樹\n");
                printf("2.遞歸算法實(shí)現(xiàn)二叉樹的先序遍歷,輸出各結(jié)點(diǎn)值\n");
                printf("3.用非遞歸算法實(shí)現(xiàn)二叉樹的遍歷,輸出各結(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.按層次遍歷二叉樹\n");
                printf("7.求二叉樹的高度(深度)\n");
                printf("8.判斷是否為完全二叉樹,輸出\"Yes!\"或\"No!\"\n");
                printf("9.交換每個(gè)結(jié)點(diǎn)的左右子樹,并用先序遍歷的方式輸出\n");
                printf("10.對(duì)交換左右子樹后的二叉樹作中序遍歷\n");
                printf("11.退出\n");
                scanf("%d",&choice);
                switch(choice){
                case 1:
                    CreateBiTree(&T);   //創(chuàng)建二叉樹
                    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("二叉樹的高度為%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);    
            }

            注記:原來的那個(gè)函數(shù)5有問題,即利用非遞歸算法求葉子結(jié)點(diǎn)的個(gè)數(shù)。
            posted on 2009-11-27 21:48 deercoder 閱讀(371) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法分析
            人人狠狠综合久久亚洲| 亚洲综合伊人久久大杳蕉| 久久精品国产男包| 99久久夜色精品国产网站| 天天综合久久一二三区| 国内精品久久久久久久久| 无码人妻久久一区二区三区免费 | 久久国产乱子精品免费女| 色欲综合久久躁天天躁| 国产A级毛片久久久精品毛片| 久久久无码精品亚洲日韩按摩 | 漂亮人妻被黑人久久精品| 99久久夜色精品国产网站| 亚洲国产成人久久精品99| Xx性欧美肥妇精品久久久久久| 亚洲国产高清精品线久久 | 国产精品欧美久久久久无广告| 国产精品美女久久福利网站| 久久精品国产只有精品66 | 欧美精品国产综合久久| 亚洲欧美日韩精品久久| 午夜不卡久久精品无码免费| 久久综合成人网| 99久久香蕉国产线看观香| 一级做a爰片久久毛片16| 久久永久免费人妻精品下载| 亚洲国产精品狼友中文久久久| 伊人色综合久久| 91精品国产91久久久久福利| 丰满少妇高潮惨叫久久久| 亚洲精品国产成人99久久| 国产91色综合久久免费| 久久久久久久久久久久中文字幕| 精品久久久久久中文字幕大豆网 | 色偷偷88888欧美精品久久久| 一本色道久久88综合日韩精品| 久久精品无码一区二区三区日韩| 久久国产V一级毛多内射| 国产午夜福利精品久久| 久久av免费天堂小草播放| 久久国产一片免费观看|