计算二叉树的深度和叶子结点数(递归算法实现)

【问题描述】

计算二叉树的深度和叶子结点数

【输入形式】

输入二叉树的先序遍历序列建立二叉树。

【输出形式】

输出二叉树的叶子结点数和深度。

【样例输入】

A

B

C

#

#

#

#

【样例输出】

Leaves:1

Depth:3

求给定二叉树的深度:

    二叉树的深度就是二叉树中结点的最大层次。如果二叉树是空树,则深度为0;否则,分别求二叉树根左子树和右子树的深度,取其中最大值加一就是该 二叉树的最大深度。

    递归计算公式为:Depth(T)={0;当T==NULL;                                                               }

                                                      {max(Depth(T->lchild),Depth(T->rchild))+1;当T!=NULL;}

如下:

int  depth(BiTree  t)
{
//此处补充代码,求取二叉树的深度
    int hl,hr;
    if(t==NULL)return 0;     //若数为空则返回0
    else
    {
        hl=depth(t->lchild);  //递归求左子树的深度
        hr=depth(t->rchild);  //递归求右子树的深度
        if(hl>hr)return (hl+1);
        else return (hr+1);
    }
}

求叶子结点数也可以通过递归的方法进行统计。

方法如下:

int  Leaves(BiTree  t)
{
//此处补充代码,统计二叉树中叶子结点数
    int count1,count2;
    if(t==NULL)return 0;   //数空
    else
        if(t->lchild==NULL&&t->rchild==NULL)return 1;//为叶子结点
        else
        {
            count1=Leaves(t->lchild);//左子树叶子结点数
            count2=Leaves(t->rchild);//右子树叶子结点数
            return count1+count2;//返回叶子结点数
        }
}

完整带码如下:

#include  <stdio.h>
#include  <stdlib.h>
#include<malloc.h>
#define  MAX  20
//二叉链表结点定义
typedef  struct  BTNode
{
    char  data;
    struct  BTNode  *lchild;
    struct  BTNode  *rchild;
}*BiTree;

void  createBiTree(BiTree  *t)
{
//此处补充代码,完成以先序遍历方式建立二叉树
    char s;
    BiTree q;
    s=getchar();
    getchar();
    if(s=='#')
    {
        *t=NULL;
        return;
    }
    q=(BiTree)malloc(sizeof(struct BTNode));
    q->data=s;
    *t=q;
    createBiTree(&q->lchild);
    createBiTree(&q->rchild);
}
/*
void  PreOrder(BiTree  p)
{
//此处补充代码,完成二叉树的先序遍历
    if(p!=NULL)
    {
        printf("%c",p->data);
        PreOrder(p->lchild);
        PreOrder(p->rchild);
    }
}

void  InOrder(BiTree  p)
{
//此处补充代码,完成二叉树的中序遍历
    if(p!=NULL)
    {
        InOrder(p->lchild);
        printf("%c",p->data);
        InOrder(p->rchild);
    }
}

void  PostOrder(BiTree  p)
{
//此处补充代码,完成二叉树的后序遍历
    if(p!=NULL)
    {
        PostOrder(p->lchild);
        PostOrder(p->rchild);
        printf("%c",p->data);
    }
}
*/
int  Leaves(BiTree  t)
{
//此处补充代码,统计二叉树中叶子结点数
    int count1,count2;
    if(t==NULL)return 0;   //数空
    else
        if(t->lchild==NULL&&t->rchild==NULL)return 1;//为叶子结点
        else
        {
            count1=Leaves(t->lchild);//左子树叶子结点数
            count2=Leaves(t->rchild);//右子树叶子结点数
            return count1+count2;//返回叶子结点数
        }
}

int  depth(BiTree  t)
{
//此处补充代码,求取二叉树的深度
    int hl,hr;
    if(t==NULL)return 0;     //若数为空则返回0
    else
    {
        hl=depth(t->lchild);  //递归求左子树的深度
        hr=depth(t->rchild);  //递归求右子树的深度
        if(hl>hr)return (hl+1);
        else return (hr+1);
    }
}
int  main()
{
//此处补充代码,按要求输出二叉树的叶子结点数和深度
    BiTree p;
    createBiTree(&p);
    printf("Leaves:%d\n",Leaves(p));
    printf("Depth:%d\n",depth(p));
    return  0;
}

运行结果如下:

计算二叉树的深度和叶子结点数(递归算法实现)

 

上一篇:3005基于二叉链表的二叉树最大宽度的计算


下一篇:C/C++实现二叉树的遍历(深度优先,广度优先)