树--计算二叉树节点个数

思路一:

首先,树的遍历从根节点开始,依次向子节点递进,重复工作,所以采用递归的方式实现节点数量的计算。

这样无法实际统计节点个数,因为size为局部变量,无法累计
int TreeSize(BTNode* root)
{
    if (root==NULL)
    {
        return;
    }
    int size = 0;
    ++size;

    TreeSize(root->left);
    TreeSize(root->right);

    return size;
}
 

如上图所示的代码块无法实现统计节点个数的功能,因为size为局部变量,超出函数实现范围后会销毁

思路二:

最粗暴的方式解决这个问题就是将size设置为全局函数 

如果使用全局变量,多次调用时会导致数值累加,必须要在再次调用前将其置零
int size = 0;
void TreeSize(BTNode* root)
{
    if (root==NULL)
    {
        return;
    }
    ++size;
    TreeSize(root->left);
    TreeSize(root->right);

}

设置全局函数size解决了局部变量无法保存的数据,却导致函数体无法连续多次调用,因为全局函数会记录size的数值,如果不置零后再调用,会显示累加结果

思路三:

所以这里采用传参的方式实现

所以采用传参的方式记录数据
void TreeSize(BTNode* root,int* size)
{
	if (root==NULL)
	{
		return;
	}
	else
	{
		++(*size);
	}
	TreeSize(root->left, size);
	TreeSize(root->right, size);
}

 可以简化为一个三目运算符表达式

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}//运用递归遍历

 计算叶节点的递归函数:

int TreeLeafSize(BTNode* root)
{
	if (root==NULL)
	{
		return 0;
	}
	else
	{
		if (root->left == NULL && root->right == NULL)
		{
			return 1;
		}
	}
	//如果既不为空,又不是叶节点,那么返回左子树与右子树上的叶结点个数之和
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值