先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)c语言

#include "stdio.h"
#include "string.h"
#include "malloc.h"
#define NULL 0
#define MAXSIZE 30
typedef struct BiTNode      //定义二叉树数据结构
{
    char data;
    struct BiTNode *lchild,*rchild;
} BiTNode;
void preCreate(BiTNode *& T)   //先序遍历建立二叉树,#代表空树
{
    char ch;
    ch=getchar();
    if(ch=='#')
        T=NULL;
    else
    {
        if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
            printf("Error!");
        T->data=ch;
        preCreate(T->lchild);
        preCreate(T->rchild);
    }
}
int getLeafNum(BiTNode *root)//统计二叉树叶子节点个数
{
    int count=0;//叶子总数,左子树叶子数.右子数叶子数
    int left_count=0;
    int right_count=0;
    /*推断根节点是否为null
      若根节点不空,推断根节点是否是叶子。是的话叶子总数+1并返回,
      若不是统计左子树叶子数目和右子数叶子数目并相加返回
      若根节点为空,则叶子数为0并返回


    */
    if(root)
    {
        if(root->lchild==NULL&&root->rchild==NULL)
            count++;
        else
        {
            left_count=getLeafNum(root->lchild);
            right_count=getLeafNum(root->rchild);
            count=left_count+right_count;
        }
    }
    else
    {
        count=0;
    }


    return count;


}
int getTreeDepth(BiTNode *root)//统计二叉树深度
{
    int depth=0;
    int left_depth=0;
    int right_depth=0;
    /*
       推断根节点是否为空,
       若根节点为空,深度置为0,并返回
       若根节点不为空,统计左子树深度,统计右子树深度,二者相加后再加上1(1位根节点)并返回
    */
    if(root)
    {
        left_depth=getTreeDepth(root->lchild);
        right_depth=getTreeDepth(root->rchild);
        depth=1+(left_depth>right_depth?

left_depth:right_depth);
    }
    else
    {
        depth=0;
    }
    return depth;


}
int main()
{
    BiTNode * bitree=NULL;
    preCreate(bitree);//先序遍历创建二叉树
    printf("叶子个数:%d\n",getLeafNum(bitree));
    printf("该二叉树深度:%d\n",getTreeDepth(bitree));
    return 0;
}

posted @ 2017-05-30 16:16  yfceshi  阅读(1090)  评论(0编辑  收藏  举报