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

一、求结点总数

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;
}

 三、运行结果

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

运行结果如下: 

以下是一个用C语言实现算法,用于计算二叉树中所有结点总数叶子结点总数: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结点结构 struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; }; // 创建新结点函数 struct TreeNode* createNode(int data) { struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); newNode->data = data; newNode->left = newNode->right = NULL; return newNode; } // 计算结点总数递归函数 int countNodes(struct TreeNode* root) { if (root == NULL) return 0; return 1 + countNodes(root->left) + countNodes(root->right); } // 计算叶子结点总数递归函数 int countLeaves(struct TreeNode* root) { if (root == NULL) return 0; if (root->left == NULL && root->right == NULL) return 1; return countLeaves(root->left) + countLeaves(root->right); } // 主函数示例 int main() { // 创建示例二叉树 struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); // 计算总数 int totalNodes = countNodes(root); int totalLeaves = countLeaves(root); // 输出结果 printf("二叉树结点总数: %d\n", totalNodes); printf("二叉树叶子结点总数: %d\n", totalLeaves); return 0; } ``` 这个程序包含以下主要部分: 1. 定义二叉树结点结构。 2. 创建新结点函数 `createNode`。 3. 计算所有结点总数递归函数 `countNodes`。 4. 计算叶子结点总数递归函数 `countLeaves`。 5. 主函数中创建一个示例二叉树,并调用上述函数计算结果。 这个算法的时间复杂度为 O(n),其中 n 是二叉树结点总数,因为每个结点都被访问一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值