二叉树相关(1计算节点个数,2计算叶子结点个数,3求二叉树高度,求K层结点个数,4找那个值所在节点的指针)

本文详细介绍了如何使用递归方法计算二叉树的节点个数、叶子节点数量、树的高度、K层节点数以及查找特定值的节点。每个操作都通过子问题思路分解,通过示例和递归展开图辅助理解,最后给出代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、计算二叉树节点个数

利用子问题思路解决:
如果只有一个节点,左右结点为空,那么返回的节点数就是 左节点数右节点数 +1
在这里插入图片描述
如果是多个节点,分解为子问题来看:
1.判断根节点是否为空,如果不为空,,计算它左、右子树的节点数,总节点数=左子树节点数 + 右子树结点数+ 它自己本身“1”。
2.它的左右子树又分成子问题,分别计算他们各自左右子树的节点数。
在这里插入图片描述

//计算二叉树结点个数
int TreeSize(BTNode* root)
{
   
	return root == NULL ? 0 : TreeSize(root->left)
	 + TreeSize(root->right) + 1;
}

举个在这里插入图片描述:以下为方便理解它的递归展开图
在这里插入图片描述
在这里插入图片描述

2、计算二叉树叶子节点个数

叶子节点:左右孩子都为空的节点叫叶子节点。
解决方法:利用子问题思想解决。计算整个树的叶子节点可有划分为–——-它的左右两个子树叶子节点的总合。他的左右子树可以继续往下划分。

  • 如果根节点为空,那么返回0;
  • 如果根节点的左右节点为NULL,说明这个节点就是一个叶子,返回1。
    先分解为子问题,如果是一个节点:
    在这里插入图片描述
    如果是多个节点:
  • 1、如果根节点为空,那么返回0;
  • 2、如果根节点的左右节点为NULL,说明这个节点就是一个叶子,返回1。
  • 如果根节点不为空左右节点也不为空,那它就不是叶子继续遍历他的左右子树,找叶子节点。
//计算叶子节点个数
int TreeleafSize(BTNode* root)
{
   
	if (root == NULL)
		return 0;
	if (root->left == NULL && root->right == NULL)
		return 1;
		//如果左右节点不为NULL,遍历它左右节点的左右子树
	return TreeleafSize(root->left) + TreeleafSize(root->right);
}

举个在这里插入图片描述
为方便进一步理解,递归展开图
在这里插入图片描述

3、求二叉树高度

依旧和以上方法相同,子问题思路解决。如果化成都是求一个结点的高度,那就方便了。计算整个树的高度,如果根节点不为空,那么,其实就是计算,它左右子树的高度(取大的那一个)+自己本身高度1.

举个在这里插入图片描述
在这里插入图片描述


//求二叉树的高度(深度)
//子问题求解
int TreeHeiht(BTNode* root)
{
   
	if (root == NULL)
		return 0;
	int Lh = TreeHeiht(root->left);
	int Rh = TreeHeiht(root->right);

	//要左右子树高的那个作为树的高度
	return Lh > Rh ? Lh+1 : Rh+1;
}

4、求二叉树K层结点个数

子问题思路解决。k表示层数
当只有一个节点时,它只有一层,一层的节点数就是1.
当求第两层的节点数,k=2,判断根节点的左右节点是否都存在,此时,把左右节点作为左右子树的根,判断根是否存在,k-1,把第一层的左右节点,看作他们所在子树的第一层。也就是化解成了,求第一层节点的问题。

//求第k层的节点数
int TreeLevel(BTNode* root, int k)
{
   
	//根节点为空,该层没有节点
	if (root == NULL)
		return 0;
	//root不为空,且是第一层,那么就一个节点
	if (k 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值