问答题 二叉树
   实验目的:
   (1)熟悉二叉树的各种存储结构及适用范围。
   (2)掌握建立二叉树的存储结构的方法。
   (3)熟练掌握二叉树的先序、中序、后序遍历的递归算法和非递归算法。
   (4)灵活运用递归的遍历算法实现二叉树的其他各种运算。
   (5)掌握和理解本实验中出现的一些基本的C语言语句。
   (6)体会算法在程序设计中的重要性。
   实验内容:
   (1)以二叉链表作存储结构,设计求二叉树高度的算法。
   (2)以二叉链表作存储结构,编写递归的中序遍历算法。
   (3)以二叉链表作存储结构,编写非递归的中序遍历算法。
   (4)以二叉链表作存储结构,编写求二叉树中叶子结点的个数算法。
【正确答案】(1)
   #define DATATYPE2 char    /*二叉树结点类型定义*/
   #define NULL'\0'
   typedef struct node
   {DATATYPE2 data;
       struct node*lchild,*rchild;
   }BTLINK;
   BTLINK *creat()    /*以二叉链表为存储结构的二叉树的建立算法*/
   {  BTLINK*q;
       BTLINK*s[30];
       int j,i;
       char x;
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);
       while(i!=0&&x!='$')
       {  q=(BTLINK*)malloc(sizeof(BTLINK));
           q->data=x;
           q->lchild=NULL;
           q->rchild=NULL;
           s[i]=q;
           if(i!=1)
           {  j=i/2;
       if(i/%2==0)
       s[j]->lchild=q;
       else s[j]->rchild=q;
       }
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);}
       return  s[1];
   }
   int depthtree(BTLINK*bt)    /*求二叉树的高度算法*/
   { int dep,depl,depr;
       if(bt==NULL)
       dep=0;
       else
       {    depl=depthtree(bt->lchild);
           depr=depthtree(bt->rchild);
               if(depl>depr)
                   dep=depl+1;
               else
                   dep=depr+1;
           }
       return dep;
   }
   main()
   {  BTLINK*bt;
       int treeh;
       bt=creat();
       treeh=depthtree(bt);
       printf("\n二叉树高度=/%d",treeh);
   }
   (2)
   #define DATATYPE2 char    /*二叉树结点类型定义*/
   #define NULL'\0'
   typedef struct node
   {DATATYPE2 data;
       struct node*lchild,*rchild;
   }BTLINK;
   BTLINK*creat()    /*以二叉链表为存储结构的二叉树的建立算法*/
   { BTLINK*q;
       BTLINK*s[30];
       int j,i;
       char x;
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);
       while(i!=0&&x!='$')
       { q=(BTLINK*)malloc(sizeof(BTLINK));
           q->data=x;
           q->lchild=NULL;
           q->rchild=NULL;
           s[i]=q;
           if(i!=1)
           {  j=i/2;
               if(i/%2==0)
               s[j]->lchild=q;
               else s[j]->rchild=q;
       }
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);}
       return s[1];
       }
   void digui(BTLINK*bt)    /*二叉树的中序遍历递归算法*/
   {  if(bt!=NULL)
   {digui(bt->lchild);
       printf("/%c  ",bt->data)j
       digui(bt->rchild);}
   }
   main()
   {  BTLINK*bt;
       bt=creat();
       digui(bt);
   }
   (3)
   #define DATATYPE2 char    /*二叉树结点类型定义*/
   #define NULL'\0'
   typedef struct node
   {DATATYPE2 data;
       struct node*lchild,*rchild;
   }BTLINK;
   BTLINK*creat()    /*以二叉链表为存储结构的二叉树的建立算法*/
   { BTLINK*q;
       BTLINK*s[30];
       int j,i;
       char x;
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);
       while(i!=0&&x!='$')
       {q=(BTLINK*)malloc(sizeof(BTLINK));
       q->data=x;
       q->lchild=NULL;
       q->rchild=NULL;
       s[i]=q;
       if(i!=1)
       {j=i/2;
       if(i/%2==0)
       s[j]->lchild=q;
       else s[j]->rchild=q;
       }
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);}
       return s[1];
       }
       void zhxuf(BTLINK*bt)    /*二叉树的中序遍历非递归算法*/
       {BTLINK*q,*s[20];
       int top=0;
       int bool=1;
       q=bt;
       do
       {while(q!=NULL)
       {top++;s[top]=q;q=q->lchild;}
       if(top==0)
           bool=0;
       else
       {  q=s[top];
           top--;
           printf("/%c",q->data);
           q=q->rchild;
   }
   }while(bool);
   }
   main()
   {  BTLINK*bt;
       bt=creat();
       zhxuf(bt);
   }
   (4)
   #define DATATYPE2 char    /*二叉树结点类型定义*/
   #define NULL'\0'
   typedef struct node
   {DATATYPE2 data;
       struct node*lchild,*rchild;
   }BTLINK;
   int k;
   BTLINK*creat()    /*以二叉链表为存储结构的二叉树的建立算法*/
   { BTLINK*q;
       BTLINK*s[30];
       int j,i;
       char x;
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);
   while(i!=0&&x!='$')
   {  q=(BTLINK*)malloc(sizeof(BTLINK));
       q->data=x;
       q->lchild=NULL;
       q->rchild=NULL;
       s[i]=q;
       if(i!=i)
       { j=i/2;
           if(i/%2==0)
               s[j]->lchild=q;
           else s[j]->rchild=q;
       }
       printf("i,x=");
       scanf("/%d,/%c",&i,&x);}
       return s[1];
   }
   void geshu(BTLINK*bt)    /*求二叉树的叶子结点个数算法*/
   {  if(bt!=NULL)
       {  geshu(bt->lchild);
           if(bt->lchild==NULL&&bt->rchild==NULL)
           k++;
           geshu(bt->rchild);)
   }
   main()
   { BTLINK*bt;
       k=0;
       bt=creat();
       geshu(bt);
       printf("二叉树叶子结点的个数=/%d",k);
   }
【答案解析】