二、2叉树的基本操作
0.建立二叉树
1.先序递归遍历形式
2.中序递归遍历形式
3.后序递归遍历形式
4.计算所有结点个数
5.计算叶子结点个数
6.计算树的深度
7.查到相同的元素
8.退出


#include<stdio.h>
#include<stdlib.h>
  typedef int Etype;
  typedef struct BiTNode  /* 树结点结构 */
      {  Etype data;
         struct BiTNode *lch,*rch;
      }BiTNode;
/* 函数原形声明 */
BiTNode *creat_bt1();
void PreOrderTraverse(BiTNode *p);
void inorderTraverse(BiTNode *p);
void PostOrderTraverse(BiTNode *p);
void BSTreeCount(BiTNode *p);
void BSTreeLeafCount(BiTNode *p);
void BSTreeDepth(BiTNode *p);
BiTNode *t;
/*  主函数 */
main()
 { char ch; int k;
  do { printf("\n\n\n");
       printf("\n\n     0. 建立二叉树");
       printf("\n\n     1. 先序递归遍历二叉树");
       printf("\n\n     2. 中序递归遍历二叉树");
       printf("\n\n     3. 后序递归遍历二叉树");             
       printf("\n\n     4. 计算所有结点个数");
       printf("\n\n     5. 计算所有结点个数");
       printf("\n\n     6. 计算树的深度");
       printf("\n\n     7. 查到相同的元素");
       printf("\n\n     8. 结束程序运行");
       printf("\n======================================");
       printf("\n     请输入您的选择 (0,1,2,3,4,5,6,7,8)");  scanf("%d",&k);
       switch(k)
     { 
       case 0:t=creat_bt1( );break; /*  调用递归建立二叉树算法   */
           case 1: { preOrderTraverse(t);            /*  调用先序遍历     */
                 printf("\n\n    打回车键,继续。"); ch=getch();
                       } break;
       case 2: { inorderTraverse(t);             /*  调用中序遍历     */
                 printf("\n\n    打回车键,继续。"); ch=getch();
               } break;
           case 3: { PostOrderTraverse(t);            /*  调用后序遍历     */
                 printf("\n\n    打回车键,继续。"); ch=getch();
                       } break;
       case 4:{  BSTreeCount(t);         /*  调用求二叉树中所有结点数函数 */
                      printf("\n\n   打回车键,继续。“); ch=getch();
                    } break;
           case 5:{ BSTreeLeafCount(t);       /*  调用求二叉树中所有叶子结点数函数 */      
                    printf("\n\n 打回车键,继续."); ch=getch();
                     }break;
           case 6:{ BSTreeDepth(t);      
               printf("\n\n 打回车键,继续."); ch=getch();
                     } break;
           case 7:
       case 8: exit(0);
      } /*  switch  */
      printf("\n ----------------");
   }while(k>=0 && k<8);
     printf("\n               再见!"); 
     printf(“\n      打回车键,返回。“); ch=getch();
} /* main */  
 /* 模仿先序递归遍历方法,建立二叉树 */
 BiTNode *creat_bt1()
  { BiTNode *t;
     printf("\n data="); scanf("%d",&e);
     if(e==0) t=NULL;                  /* 对于0值,不分配新结点 */
       else { t=(BiTNode *)malloc(sizeof(BiTNode));
              t->data=e;
              t->lch=creat_bt1();  /* 左孩子获得新指针值  */
              t->rch=creat_bt1();  /* 右孩子获得新指针值  */
             }
     return(t);
  } /* creat_bt1 */
/* 先序递归遍历二叉树  */ 
void preOrderTraverse(BiTNde *p)
 { if (p) { printf("%3d",p->data); 
            PreOrderTraverse(p->lch);
              PreOrderTraverse(p->rch);
             }
} /* preOrderTraverse  */
/* 中序递归遍历二叉树  */
void inorderTraverse(BiTNode *p)
 { if (p) {  inorderTraverse(p->lch);
             printf("%3d",p->data);
             inorderTraverse(p->rch);
          }
 } /* inorderTraverse  */
/* 后序递归遍历二叉树  */
void PostOrderTraverse(BiTNode *p)
{ if(p) { PostOrderTraverse(p->lch);
          PostOrderTraverse(p->rch);
          printf("%3d",p-.>data);
              }
} /* PostOrderTraverse  */
/* 计算二叉树中所有结点数 */
void BSTreeCount(BiTNode *p)
{
    if(p==NULL) return 0;
    else 
        return BSTreeCount(p->lch)+BSTreeCount(p->rch)+1;
}/* BSTreeCount  */

/* 计算二叉树中所有叶子结点数 */
void BSTreeLeafCount(BiTNode *p)
{
    if(p==NULL) return 0;
    else if(p->lch==NULL && p->rch==NULL) return 1;
    else return BSTreeLeafCount(p->lch)+BSTreeLeafCount(p->rch);
}/* BSTreeLeafCount */

/* 计算二叉树的深度 */
void BSTreeDepth(BiTNode *p)
{
    if(p==NULL)
        return 0;  /* 对于空树,返回0并结束递归 */
    else 
    {
     
        int dep1=BSTreeDepth(p->lch);      /* 计算左子树的深度 */
        int dep2=BSTreeDepth(p->rch);     /* 计算右子树的深度 */
        if(dep1>dep2) return dep1+1;          /* 返回树的深度 */
        else return dep2+1;
    }
}/* BSTreeDepth  */




编 了 一 下 竟 有 26个 错 误  请 高 手 指 教 
还 有 第 七 个 问 题 怎 么 编 啊  谢 谢