二叉树的常见问题

前序遍历:

规定访问次序,根节点→左节点→右节点在这里插入图片描述我们可以发现每次访问完一个根节点之后,我们都必须要通过递归的方式访问它的左右节点,直到访问到叶子节点结束,由此可以得出这里递归的结束条件是左右节点均为空

/*tree为结构体struct tree
struct tree: int val,struct tree* left,struct tree* right*/
void PrevOrder(tree* root)
{
	if(root==NULL)
		return;
	printf("%d ",root->val);
	PrevOrder(root->left);
	PrevOrder(root->right);
}//由于遍历操作较为简单,这里不画出递归展开图演示

中序遍历、后序遍历:

中序: 左节点→根节点→右节点
后序: 左节点→右节点→根节点
在这里插入图片描述
原理相同,代码片简要展示

void InOrder(tree* root)//中序
{
	if(root==NULL)
		return;
	InOrder(root->left);//一直递归到最左边
	printf("%d ",root->val);
	InOrder(root->right);
}
void PostOrder(tree* root)//后序
{
	if(root==NULL)
		return;
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ",root->val);
}

统计总节点数:

分析:
节点总数=1(根节点)+左子树总节点+右子树总节点
简单来说,如果我们要统计节点总数,就是 第一层的节点数,第一层左子树节点数,第一层右子树节点数三者之和,每一个左右子树又可以视为一个单独的二叉树按照同样的公式计算出总节点数
由此我们可以退出递推表达式:

int treesize(tree* root)
{
	if(root==NULL)
		return 0;//当访问到叶子节点时需要返回
	return treesize(root->left)+
		   treesize(root->right)+1;
}

部分递归展开图:
在这里插入图片描述

统计叶子节点个数:

从根节点出发开始递归,当遇到左右节点均为空的即为叶子节点,计数1

int leafsize(tree* root)
{
	if(root==NULL)
		return 0;
	if(root->left==NULL&&root->right==NULL)
		return 1;
	return leafsize(root->left)+leafsize(root->right);
}

第K层节点数:

在这里插入图片描述

int levelsize(tree* root,int k)
{
	if(root==NULL)
		return 0;
	if(k==1)
		return 1;
	return levelsize(root->left,k-1)+levelsize(root->right,k-1);
}

文章结束,喜欢的话可以留个赞,关注一下嘛?蟹蟹。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shall#

你的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值