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