二叉树的算法

来源:互联网 发布:cat翻译软件 编辑:程序博客网 时间:2024/06/07 15:49
#include<stdio.h>


typedef struct Node{
    char data;
    struct Node *LChild;
    struct Node *RChild;
}BiTNode,*BiTree;


void CreateBiTree(BiTree *bitree){
     char c = getchar();
     if(c == '.')  (*bitree) = NULL;
     else
    {
        (*bitree) = (BiTree)malloc(sizeof(BiTNode));
        (*bitree) ->data = c;
        CreateBiTree(&((*bitree)->LChild));
        CreateBiTree(&((*bitree)->RChild));
     }
}




 //先序遍历二叉树
void PreOrder(BiTree root)
{
        if(root != NULL){
        //访问根节点
        printf("%c",root->data);
        //遍历左子树
        PreOrder(root->LChild);
        //遍历右子树
        PreOrder(root->RChild);


    }
}




//中序遍历二叉树
InOrder(BiTree root)
{
         if (root!=NULL){
         //遍历左子树
         InOrder(root ->LChild);
         //访问根节点
         printf("%c",root ->data);
         //遍历右子树
         InOrder(root ->RChild);
         }
}




//后序遍历二叉树
void  PostOrder(BiTree root)
{
        if(root!=NULL){
        //遍历左子树
         PostOrder(root ->LChild);
        //遍历右子树
        PostOrder(root ->RChild);
        //访问根结点
        printf("%c",root ->data);
        }
}




//先序遍历输出二叉树结点, root为指向二叉树根结点的指针
 void  PreOrder1(BiTree root)
   {
if (root!=NULL)
   {
           //访问根结点
           printf("%c",root ->data);
           //先序遍历左子树
           PreOrder(root ->LChild);
           //先序遍历右子树
           PreOrder(root ->RChild);
        }
    }




//先序遍历输出二叉树中的叶子结点 , root为指向二叉树根结点的指针
void  PreOrder2(BiTree root)
{
    if (root!=NULL)
    {
            if (root ->LChild==NULL && root ->RChild==NULL)
            //输出叶子结点
            printf("%c",root ->data);
            //先序遍历左子树
            PreOrder(root ->LChild);
            //先序遍历右子树
            PreOrder(root ->RChild);
    }
}




int leaf(BiTree root)
 {
      int LeafCount;
      if(root==NULL)
      LeafCount =0;
      else if ((root->LChild==NULL)&&(root->RChild==NULL))
            LeafCount =1;
      else
            LeafCount =leaf(root->LChild)+leaf(root->RChild);
                 return  LeafCount;
 }






 //后序遍历求二叉树bt高度的递归算法
int PostTreeDepth(BiTree bt)
{
        int hl, hr, max;
        if(bt!=NULL)
        {
            //求左子树的深度
            hl=PostTreeDepth(bt->LChild);
            //求右子树的深度
            hr=PostTreeDepth(bt->RChild);
            //比较
            max=hl>hr?hl:hr;
            return(max+1);
        }
          else return(0);
}
int Hmax=0;
void PreTreeDepth(BiTree bt, int h)
{
           if(bt==NULL) return ;

           if(bt->LChild==NULL&&bt->RChild==NULL)
           {
                  Hmax = Hmax>h ? Hmax:h;
           }
            //遍历左子树
            PreTreeDepth(bt->LChild, h+1);
            //遍历右子树
            PreTreeDepth(bt->RChild, h+1);


}






int main()
{
    BiTree tree;
    CreateBiTree(&tree);


    printf("PreOrder:\n");
    PreOrder(tree);




    printf("\nInOrder:\n");
    InOrder(tree);
    printf("\nPostOrder:\n");
    PostOrder(tree);




    printf("\nPreOrder1:\n");
    PreOrder1(tree);




    printf("\nPreOrder2:\n");
    PreOrder2(tree);




    printf("叶子数:%d\n",leaf(tree));
    printf("后序遍历求二叉树的高度:%d\n",PostTreeDepth(tree));




    Hmax=0;
    PreTreeDepth(tree,1);
    printf("\nPreTreeDepth: % d\n",Hmax);






    return 0;
}