返回给定二叉树中一层最多的节点个数(仅使用队列实现)

Posted Aline2021-yxz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回给定二叉树中一层最多的节点个数(仅使用队列实现)相关的知识,希望对你有一定的参考价值。

思路点拨:我们知道对二叉树实现层序遍历(也就是一层一层遍历)需要使用队列,而要找出节点最多的那一层,必然避不开要算出每一层节点的个数,那也就避不开层序遍历。

除此之外,我们还需要维护几个变量:
1:curend//当前层的最后一个节点
2:nextend//下一层的最后一个节点
3:curcount//当前层节点个数
4:maxcount//最多的节点个数

有了这几个变量,我们就可以完成这件事情,之后我们可以这样理解层序遍历:
层序遍历时删除的都是当前层的节点,入的都是下一层的节点

为了便于理解,先看一个例子感受一下:

对于上图,如何使用这几个变量和层序遍历完成任务呢?

1:先让1入队,curend设置为1,nextend设置为NULL
2:让1出队,curcount++(因为1为当前层节点),同时让2,3依次入队,每入一个设置nextend为入的节点,例如2入队,就设置nextend为2,之后3入队,就设置3为nextend,这样我们就能保证nextend确实存储的是下一层的最后一个节点,之后因为1为当前层的最后一个节点,所以这一层就遍历完了,需要更新maxcount(curcount小于maxcount的话不用管),并且将curcount归0(因为接下来是新的一层),最重要的是不要忘了curend也变了,变为原来的nextend,也就是3,nextend不需要改变,因为再入节点时它自己会变。
3:重复操作直到遍历结束

如果你已经初步理解了思路,我相信代码的实现是很简单的:
代码实现

int Find_Max_Floor(Node* head)

	int maxcount = -1;//最多的节点数
	Node* curend = head;//当前层的最后一个节点
	Node* nextend = NULL;//下一层的最后一个节点
	int curcount = 0;//当前层的节点数
	queue<Node*> Q;//用于层序遍历的队列
	Q.push(head);
	while (!Q.empty())//为空证明遍历结束
	
		Node* tmp = Q.front();
		curcount++;
		//并将其子节点入队
		if (tmp->left != NULL)
		
			Q.push(tmp->left);
			nextend = tmp->left;
		
		if (tmp->right != NULL)
		
			Q.push(tmp->right);
			nextend = tmp->right;
		
		Q.pop();//删除当前层节点
		if (tmp == curend)//如果当前节点是当前层的最后一个,
		//更新maxcount和curend
		
			if (curcount > maxcount)
				maxcount = curcount;
			curcount = 0;
			curend = nextend;
		
	
	return maxcount;


以上是关于返回给定二叉树中一层最多的节点个数(仅使用队列实现)的主要内容,如果未能解决你的问题,请参考以下文章

返回给定二叉树中一层最多的节点个数(仅使用队列实现)

483,完全二叉树的节点个数

二叉树刷题篇 完全二叉树的节点个数

Leetcode 222.完全二叉树的节点个数

w9-2 求二叉树中节点间的宽度

222. 完全二叉树的节点个数