题目:
题目如标题所示,如果二叉树如下图所示,则最宽层数节点数为2(b,c层)。
分析:
依然是前面文章中提到的按层遍历,不过这次在按层遍历的过程中,需要知道每层结束的节点是哪个,否则无法获取到每层节点的个数。
为了知道每层节点的个数,需要增加几个变量来辅助完成。curLevelEndNode : 当前层最末端节点 。 nextLevelEndNode:下一层最末端节点。 curLevelNodeNum:当前层节点数量。 maxLevelNum:最大层节点数量。
代码实现:
public static int maxWidthUseMap(Node head){
if (head == null){
return 0;
}
//上来第一层,最后节点肯定是head节点
Node curLevelEndNode = head;
Node nextLevelEndNode = null;
int curLevelNodeNum = 0;
int maxLevelNum = 0;
Queue<Node> heap = new LinkedList<>();
//先将head节点加到队列中。
heap.add(head);
while (!heap.isEmpty()){
Node cur = heap.poll();
//如果当前节点的左右子节点不为null,则添加到队列
//并且,在处理当前层节点的同时,一起处理下一层最末端节点
if (cur.left != null){
heap.add(cur.left);
nextLevelEndNode = cur.left;
}
// 根据左右子节点不为null情况,下一层最末端节点也跟着一起走
if (cur.right != null){
heap.add(cur.right);
nextLevelEndNode = cur.right;
}
//每在队列中弹出一次,当前层数++
curLevelNodeNum++;
//当前节点为当前层的最末端节点
if (cur == curLevelEndNode){
//因为再弹出就是下一层节点
//所以将下一层最末端节点 = 当前层最末端节点
curLevelEndNode = nextLevelEndNode;
//取层数最大值
maxLevelNum = Math.max(curLevelNodeNum,maxLevelNum);
//遍历下一层节点,当前节点层数归属
curLevelNodeNum = 0;
}
}
return maxLevelNum;
}