二叉树树叶统计算法详解

一、引言

二叉树树叶,就是度为零的结点,或者说左右子树都为空的结点就是树叶。要统计这些树叶的个数,也就是统计一下左右子树均为空的结点个数,因此只需要在二叉树上依次查看每一个结点的左右子树是否为空即可,可以安装先序遍历算法来统计,也可以按照中序遍历、后序遍历和层次遍历等算法来统计。
本文给出了基于二叉树层次遍历算法来统计二叉树树叶个数的算法及其基于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 ) ;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值