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

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

            int PreOrderTraverse(BiTree T) //用遞歸算法寫的遍歷函數(shù),按照先序遍歷,同時輸出結(jié)點的值
            {
                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ù),按照先序遍歷,同時輸出結(jié)點的值
            {
               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é)點的個數(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é)點的個數(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) //利用非遞歸算法,同時采用層次遍歷的方法,得到度為0的結(jié)點  
            {
                 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é)點的個數(shù)
            {
                int num=get_all_node(T)-2*get_node0_1(T)+1;
                return num;
            }
            int get_node1_1(BiTree T)   //非遞歸算法,同時利用關(guān)系求度為1的結(jié)點。
            {
                int num=get_all_node(T)-2*get_node0_2(T)+1;
                return num;
            }
            int get_node2(BiTree T) //利用度為2的結(jié)點個數(shù)與度為0的結(jié)點個數(shù)的關(guān)系得到
            {
                int num=get_node0_1(T)-1;
                return num;
            }
            int get_node2_1(BiTree T)   //非遞歸算法,同時利用關(guān)系求度為2的結(jié)點。
            {
                int num=get_node0_2(T)-1;
                return num;
            }
            int get_node(BiTree T)
            {
                int get;
               printf("請輸入你要查找的結(jié)點的度\n");
               printf("1.查詢度為0的所有結(jié)點的個數(shù)\n");
               printf("2.查詢度為1的所有結(jié)點的個數(shù)\n");
               printf("3.查詢度為2的所有結(jié)點的個數(shù)\n");
               scanf("%d",&get);
               switch(get){
               case 1:
                  printf("度為0的所有結(jié)點的個數(shù)是%d\n",get_node0_1(T));
                  break;
               case 2:
                   printf("度為1的所有結(jié)點的個數(shù)是%d\n",get_node1(T));
                   break;
               case 3:
                   printf("度為2的所有結(jié)點的個數(shù)是%d\n",get_node2(T));
                   break;
               }
               return OK;
            }
            int get_node_1(BiTree T)        //利用非遞歸算法的實現(xiàn)
            {
                int get;
                printf("下面是用非遞歸算法來查詢\n");
               printf("請輸入你要查找的結(jié)點的度\n");
               printf("1.查詢度為0的所有結(jié)點的個數(shù)\n");
               printf("2.查詢度為1的所有結(jié)點的個數(shù)\n");
               printf("3.查詢度為2的所有結(jié)點的個數(shù)\n");
               scanf("%d",&get);
               switch(get){
               case 1:
                  printf("度為0的所有結(jié)點的個數(shù)是%d\n",get_node0_2(T));
                  break;
               case 2:
                   printf("度為1的所有結(jié)點的個數(shù)是%d\n",get_node1_1(T));
                   break;
               case 3:
                   printf("度為2的所有結(jié)點的個數(shù)是%d\n",get_node2_1(T));
                   break;
               }
               return OK;
            }
            int LevelOrder(BiTree T)
               Queue *q;
                 BiTree p;
                 int flag=0;                      //定義flag為層號
                 q=(Queue *)malloc(sizeof(Queue));  //申請循環(huán)隊列空間
                 q->rear=q->front=q->count=0;      //將循環(huán)隊列初始化為空
                 q->data[q->rear]=T;
                 q->count++;
                 q->rear=(q->rear+1)%queuesize;       //將根結(jié)點入隊
                 while (q->count)                   //若隊列不為空,做以下操作
                     if(q->data[q->front]){            //當(dāng)隊首元素不為空指針,做以下操作
                         p=q->data[q->front];           //取隊首元素*p
                         printf("%d ",p->data);        //打印*p結(jié)點的數(shù)據(jù)域信息
                         ++flag;
                         q->front=(q->front+1)%queuesize;
                         q->count--;       //隊首元素出隊
                         if (q->count==queuesize)//若隊列為隊滿,則打印隊滿信息,退出程序的執(zhí)行
                             printf("the queue full!\n");
                         else{            //若隊列不滿,將*p結(jié)點的左孩子指針入隊
                             q->count++;q->data[q->rear]=p->lchild;
                             q->rear=(q->rear+1)%queuesize;
                                               //enf of if
                         if (q->count==queuesize)        //若隊列為隊滿,則打印隊滿信息,退出程序的執(zhí)行
                             printf("the queue full!\n");
                         else{                      //若隊列不滿,將*p結(jié)點的右孩子指針入隊
                             q->count++;q->data[q->rear]=p->rchild;
                             q->rear=(q->rear+1)%queuesize;
                                                     //end of if
                                                   //end of if
                     else{                          //當(dāng)隊首元素為空指針,將空指針出隊
                         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)   //采用遞歸算法來實現(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;         //定義一個指向BiTNode結(jié)點的指針
                int choice;
                do{
                printf("\n");
                printf("請選擇操作:\n");
                printf("1.按照先序的次序生成一顆二叉樹\n");
                printf("2.遞歸算法實現(xiàn)二叉樹的先序遍歷,輸出各結(jié)點值\n");
                printf("3.用非遞歸算法實現(xiàn)二叉樹的遍歷,輸出各結(jié)點值\n");
                printf("4.求度分別為0、1、2的結(jié)點的數(shù)目(遞歸算法實現(xiàn))\n");
                printf("5.求度分別為0、1、2的結(jié)點的數(shù)目(非遞歸算法實現(xiàn))\n");
                printf("6.按層次遍歷二叉樹\n");
                printf("7.求二叉樹的高度(深度)\n");
                printf("8.判斷是否為完全二叉樹,輸出\"Yes!\"或\"No!\"\n");
                printf("9.交換每個結(jié)點的左右子樹,并用先序遍歷的方式輸出\n");
                printf("10.對交換左右子樹后的二叉樹作中序遍歷\n");
                printf("11.退出\n");
                scanf("%d",&choice);
                switch(choice){
                case 1:
                    CreateBiTree(&T);   //創(chuàng)建二叉樹
                    break;
                case 2:
                    PreOrderTraverse(T); //利用遞歸算法的先序遍歷,輸出結(jié)點值
                    break;
                case 3:
                    PreOrderTraverse2(T);//利用非遞歸算法的先序遍歷,輸出結(jié)點值
                    break;
                case 4:
                    get_node(T); //利用遞歸算法得到的各個結(jié)點的個數(shù)
                    break;
                case 5:
                    get_node_1(T);  //利用非遞歸算法得到的各個結(jié)點的個數(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);    
            }

            注記:原來的那個函數(shù)5有問題,即利用非遞歸算法求葉子結(jié)點的個數(shù)。
            posted on 2009-11-27 21:48 deercoder 閱讀(364) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法分析
            国产精品久久久久久久| 久久久久久伊人高潮影院| 性欧美大战久久久久久久| 色综合久久最新中文字幕| 久久棈精品久久久久久噜噜| 热RE99久久精品国产66热| 亚洲伊人久久大香线蕉苏妲己| 久久精品国产亚洲AV无码娇色 | 国产精品久久久久乳精品爆| 亚洲AV无码久久精品狠狠爱浪潮| 成人久久免费网站| 亚洲va久久久噜噜噜久久 | 久久中文字幕人妻熟av女| 久久精品亚洲精品国产欧美| 色偷偷91久久综合噜噜噜噜| 色妞色综合久久夜夜| 久久综合88熟人妻| 久久精品国产亚洲av日韩| 日本免费久久久久久久网站| 久久精品一区二区影院| 亚洲国产高清精品线久久 | 国产亚洲精品久久久久秋霞| 亚洲AV日韩精品久久久久久久| 久久久精品人妻一区二区三区四| 日本精品久久久久中文字幕8| 久久精品无码一区二区日韩AV| 久久99久国产麻精品66| 国产99精品久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 漂亮人妻被中出中文字幕久久 | 久久久久久久免费视频| 久久九九精品99国产精品| 99久久国产综合精品网成人影院| 亚洲精品成人久久久| 2020久久精品国产免费| 亚洲性久久久影院| 国内精品久久久久| 东方aⅴ免费观看久久av| 精品国产91久久久久久久a| 伊人久久大香线蕉av不变影院| 国产午夜电影久久|