递归求二叉树的结点总数及叶子结点总数

一、求结点总数

1.使用1个局部变量进行计数

有的方法中将左右子树分别进行计算,需要使用到两个变量;若使用全局变量,在对多个二叉树计算节点数时结果会进行累计,不易观察,使用一个全局变量就很方便。

2.思想

结点总数=根结点数+左子树结点数+右结点数;判断根结点不为空,count++,然后再加上左右子树的个数。

3.注意

这里计算的是结点总数,左右子树需要分别进行判断是否为空。

4.代码

//总的结点数
int NodeNum(BTNode *T)
{
	int count=0;
	if (T)
	{
		count++;
		if (T->Lchild)
		{
			count+= NodeNum(T->Lchild);
		}
		if (T->Rchild)
		{
			count+= NodeNum(T->Rchild);
		}
		return count;
	}
}

二、求叶子结点总数

1、与计算总结点数的区别

这里需要注意叶子结点的定义,即左孩子和右孩子同时为空,同时也需要同时判断左子树以及右子树。

2、代码

//叶子结点数
int LeavesNodeNum(BTNode* T)
{
	int count = 0;
	if (T != NULL)
	{
		if ((T->Lchild == NULL) && (T->Rchild == NULL)) count++;
		count+=LeavesNodeNum(T->Lchild);
		count+=LeavesNodeNum(T->Rchild);
	}
	return count;
}

 三、运行结果

用二叉链表的先序遍历法建立二叉树,下图是进行测试的二叉树:

运行结果如下: 

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 递归算法二叉树叶子结点的数目可以使用以下步骤: 1. 如果二叉树为空,则叶子结点数目为。 2. 如果二叉树只有一个结点,则叶子结点数目为1。 3. 如果二叉树不为空且有左右子树,则叶子结点数目为左子树叶子结点数目加上右子树叶子结点数目。 具体实现可以参考以下代码: ``` int countLeafNodes(TreeNode* root) { if (root == nullptr) { return ; } if (root->left == nullptr && root->right == nullptr) { return 1; } return countLeafNodes(root->left) + countLeafNodes(root->right); } ``` 其,`TreeNode`表示二叉树结点的结构体,包含左右子树指针和结点值等信息。函数`countLeafNodes`接受一个二叉树结点指针,返回叶子结点数目。在函数内部,首先判断根结点是否为空,如果是则返回;然后判断根结点是否为叶子结点,如果是则返回1;否则递归计算左右子树叶子结点数目,并将它们相加返回。 ### 回答2: 二叉树是一种重要的数据结构,在计算机科学领域广泛应用,如排序、搜索、图形等。其叶子结点是指没有子节点的节点,也称为终端节点。对于一颗二叉树,我们可以使用递归算法出其叶子结点的数目。 根据递归的思想,叶子结点的数目等于左子树叶子结点数目加上右子树叶子结点数目。因此,我们可以设计一个递归函数实现这个过程。具体实现方法如下: 1. 定义一个函数 countLeaf(node),表示以 node 为根节点的二叉树所有叶子结点的数目。 2. 如果 node 为空节点,返回 0。 3. 如果 node 是叶子节点,返回 1。 4. 否则,返回 countLeaf(node.left) 加上 countLeaf(node.right)。 最后,我们可以调用 countLeaf(root) 来出以 root 为根节点的二叉树叶子结点的数目。 举个例子,假设我们有如下的二叉树: ``` 1 / \ 2 3 / \ \ 4 5 6 / \ 7 8 ``` 其叶子结点为 4、5、7 和 8。我们可以从根节点 1 开始,计算它的左子树和右子树的叶子结点数目,最后将它们相加,即可得到整颗树的叶子结点数目为 4。 综上所述,递归算法二叉树叶子结点的数目是一种简单而有效的方法,减少了循环操作,提高了程序的可读性和可维护性。 ### 回答3: 二叉树是一种树结构,每个节点最多有两个子节点。叶子结点指没有子节点的节点。二叉树叶子结点的数目,可以使用递归算法。 首先,考虑递归结束条件。如果当前节点为空,即没有子节点了,说明已经到达了树的末端,返回0。 接着,考虑递归过程。对于每个非空节点,递归调用函数计算其左子树和右子树叶子结点的数目,并将这两个数目相加。因此,递归过程可以描述为: - 如果当前节点为空,返回0 - 如果当前节点不为空,先递归计算左子树叶子结点的数目,再递归计算右子树叶子结点的数目 - 将左子树和右子树叶子结点的数目相加,并加上当前节点是否是叶子节点的判断结果 具体的代码实现如下: ``` public int countLeaves(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return 1; } return countLeaves(root.left) + countLeaves(root.right); } ``` 其,TreeNode是二叉树节点的定义,包含了左子节点和右子节点。在递归过程,先判断当前节点是否为空,然后再判断当前节点是否为叶子节点,最后分别递归计算左子树和右子树叶子结点的数目,并将结果相加。 以上就是递归算法二叉树叶子结点数目的过程和代码实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值