青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-145  評論-173  文章-70  trackbacks-0
二叉樹的實(shí)驗(yàn)操作:
題目如下:
1.設(shè)某二叉樹的結(jié)點(diǎn)類型為整數(shù)類型,以二叉鏈表形式作為存儲結(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) 對交換左右子樹后的二叉樹作中序遍歷。
#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類型的指針,通過修改來對main中的T做修改,然后使其指向根結(jié)點(diǎn)
  // 按先序次序輸入二叉樹中結(jié)點(diǎn)的值(一個(gè)字符),空格字符表示空樹,
  // 構(gòu)造二叉鏈表表示的二叉樹T。
  int ch;
  printf("請輸入一個(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("請輸入你要查找的結(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("請輸入你要查找的結(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為層號
     q=(Queue *)malloc(sizeof(Queue));  //申請循環(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("請選擇操作:\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.對交換左右子樹后的二叉樹作中序遍歷\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 閱讀(378) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法分析
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩亚洲精品电影| 亚洲欧美在线磁力| 亚洲欧洲综合| 久久国产精品久久w女人spa| 最新日韩av| 久久久久久久久伊人| 国产精品成人免费| 国产精品99久久久久久久久久久久| 麻豆av福利av久久av| 亚洲欧美日韩综合| 国产女主播一区二区三区| 亚洲欧美日韩一区在线| 一本久久综合亚洲鲁鲁| 欧美日韩一区二区三区在线看| 亚洲美女一区| 日韩亚洲国产欧美| 欧美亚洲不卡| 欧美一级二级三级蜜桃| 久久久久久亚洲综合影院红桃 | 欧美aⅴ一区二区三区视频| 午夜在线观看免费一区| 国产美女一区二区| 久久久久久高潮国产精品视| 午夜精品免费| 国产一区二区三区成人欧美日韩在线观看| 欧美一区1区三区3区公司| 午夜精品短视频| 99re66热这里只有精品4| 欧美伦理视频网站| 一区二区三区日韩在线观看| 在线亚洲成人| 国产日韩欧美一区| 开心色5月久久精品| 久久全球大尺度高清视频| 亚洲日本va午夜在线电影| 99re热这里只有精品视频| 国产精品日韩在线| 老司机一区二区三区| 欧美精品乱码久久久久久按摩| 这里只有精品在线播放| 亚洲男人第一av网站| 一区二区在线视频播放| 亚洲精品国产日韩| 国产精品久久久久久久app| 久久精品91久久久久久再现| 免费不卡亚洲欧美| 午夜精品美女久久久久av福利| 久久精品一区二区| 一区二区三区免费看| 久久成人一区二区| 一区二区三区视频在线看| 亚洲欧美一区二区原创| 亚洲人成在线免费观看| 亚洲私人黄色宅男| 亚洲国产成人av| 亚洲在线一区二区| 亚洲精品色图| 久久精品国产69国产精品亚洲| 一区二区三区日韩精品| 久久久久久综合| 午夜精品久久一牛影视| 欧美激情一区二区三区四区| 久久久久国产一区二区三区四区| 欧美精品videossex性护士| 久久久蜜桃一区二区人| 国产精品久久久久久久浪潮网站| 欧美激情小视频| 国产亚洲一区二区三区在线播放| 亚洲精品国精品久久99热一| 尤物精品在线| 欧美一区二区三区免费视| 一区二区三区视频在线看| 久久综合色一综合色88| 久久久.com| 国产精品一区二区久久精品| 亚洲美女色禁图| 最新中文字幕亚洲| 久久夜色撩人精品| 久久亚洲欧美| 国产午夜精品麻豆| 亚洲精品日本| 亚洲欧美不卡| 亚洲精品在线电影| 久久五月激情| 久久国产精品亚洲77777| 国产精品r级在线| 91久久精品国产91久久| 樱桃国产成人精品视频| 久久精品国产免费观看| 久久成人18免费观看| 国产欧美日韩一区| 亚洲欧美网站| 久久精品日产第一区二区| 国产欧美日韩视频在线观看| 亚洲欧美日本视频在线观看| 先锋影音久久| 国产专区一区| 久久欧美肥婆一二区| 欧美mv日韩mv亚洲| 亚洲黄一区二区| 欧美成人国产| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲日本一区二区三区| 欧美福利视频在线| 亚洲免费大片| 亚洲欧美日本国产有色| 国产精品综合av一区二区国产馆| 午夜精品久久久久| 久久婷婷av| 亚洲精品自在在线观看| 欧美视频在线一区二区三区| 亚洲午夜国产一区99re久久 | 午夜精品福利在线观看| 国产精品一区毛片| 久久久久久亚洲精品中文字幕| 欧美激情视频一区二区三区在线播放| 亚洲欧洲另类国产综合| 欧美xxx成人| 国产精品99久久久久久久女警| 欧美一级视频免费在线观看| 国产精品一二一区| 久久久久久穴| 亚洲美女黄色| 久久激情五月丁香伊人| 亚洲黄色一区| 国产精品看片你懂得| 久久成人这里只有精品| 亚洲国产欧美不卡在线观看| 亚洲欧美bt| 亚洲电影在线观看| 欧美午夜视频网站| 久久精品国产一区二区三区| 欧美国产精品日韩| 亚洲免费中文| 亚洲全部视频| 国产亚洲一区二区三区在线观看 | 免费成人在线视频网站| 99热精品在线| 欧美aa在线视频| 亚洲欧美激情四射在线日| 在线日韩欧美视频| 国产精品自拍三区| 欧美日韩精选| 久久亚洲精品网站| 亚洲欧美美女| 亚洲最新色图| 欧美大片专区| 国产女优一区| 午夜精品久久久久久久白皮肤| 亚洲国产精品一区二区第四页av| 午夜免费日韩视频| 亚洲欧洲在线免费| 好吊日精品视频| 国产麻豆视频精品| 欧美日韩少妇| 免费看av成人| 久久久久久有精品国产| 亚洲欧美日韩精品综合在线观看| 亚洲激情网站| 欧美成人视屏| 麻豆国产精品一区二区三区 | 亚洲区欧美区| 欧美国产一区二区| 蜜乳av另类精品一区二区| 亚洲欧美国产另类| 亚洲天堂av图片| 亚洲免费观看高清完整版在线观看熊 | 久久一日本道色综合久久| 夜夜爽www精品| 亚洲精品国精品久久99热| 欧美在线免费| 午夜在线一区| 午夜精品美女自拍福到在线| 一区二区三区日韩欧美精品| 亚洲免费电影在线观看| 亚洲精品一区二区三区福利| 亚洲国产精品123| 在线免费日韩片| 亚洲高清在线观看| 在线观看亚洲视频| 在线观看成人av| 亚洲第一天堂无码专区| 今天的高清视频免费播放成人 | 亚洲天堂av电影| 亚洲视频碰碰| 亚洲免费网站| 久久精品国产久精国产一老狼| 午夜国产不卡在线观看视频| 亚洲欧美日韩一区二区| 欧美一区二区三区精品| 久久超碰97人人做人人爱| 久久久国产精品亚洲一区| 久久精品在线| 免费中文字幕日韩欧美| 亚洲大片在线| aa亚洲婷婷| 欧美一区三区二区在线观看| 久久久久国产精品一区三寸| 欧美成人激情在线| 欧美日韩一区自拍|