一、引言
二叉树树叶,就是度为零的结点,或者说左右子树都为空的结点就是树叶。要统计这些树叶的个数,也就是统计一下左右子树均为空的结点个数,因此只需要在二叉树上依次查看每一个结点的左右子树是否为空即可,可以安装先序遍历算法来统计,也可以按照中序遍历、后序遍历和层次遍历等算法来统计。
本文给出了基于二叉树层次遍历算法来统计二叉树树叶个数的算法及其基于C语言的实现。
二、统计二叉树树叶的基本方法
如下图所示的二叉树,二叉树的树叶个数是3,即结点d、结点g和结点h是树叶。
算法思想:可以采用类似层次遍历二叉树的方法,把访问结点改为判断结点左右子树是否同时为空即可。具体如下:
引入队列缓存二叉树上结点。
1、首先让树根入栈;
2、重复执行如下动作:
队首元素出队列,判断其左右子树是否同时为空,是,则树叶个数加1,否则非空的子树入队列。
三、统计二叉树树叶个数的源代码
1、结点结构
typedef struct node
{
char data;
struct node *Lchild;
struct node *Rchild;
}BiTree;
2、使用队列的算法源程序
int SearchLeafNumQueue( BiTree *T )
{
BiTree *queue[MAX_NODE], *p;
int front, rear, num;
front = rear = 0;
num = 0;
if ( T == NULL)
{
printf( "树为空树!\n" );
return 0;
}
//当树非空的时候,统计树叶个数
p = T;
queue[ rear++ ] = p;
while ( front < rear )
{
p = queue[ front++ ];
//左子树和右子树均为空,则为树叶
if ( p->Lchild == NULL && p->Rchild == NULL)
num++;
if( p->Lchild != NULL )
queue[ rear++ ] = p->Lchild;
if( p->Rchild != NULL )
queue[ rear++] = p->Rchild;
}
return( num ) ;
}
3、也可以使用栈来实现统计树叶的个数,左右子树入栈的次序可以随意(此法实为先序遍历法的过程),源程序如下:
int SearchLeafNum( BiTree *T )
{
BiTree *stack[MAX_NODE],*p;
int top = 0, num = 0;
if ( T == NULL)
{
printf( "树为空树!\n" );
return 0;
}
//当树非空的时候,统计树叶个数
p = T;
stack[ ++top ] = p;
while ( top > 0 )
{
p = stack[ top-- ];
//左子树和右子树均为空,则为树叶
if ( p->Lchild == NULL && p->Rchild == NULL)
num++;
if( p->Rchild != NULL )
stack[++top] = p->Rchild;
if( p->Lchild != NULL )
stack[++top] = p->Lchild;
}
return( num ) ;
}