1.题目
2.思路
用bfs来遍历每一层的节点,然后对每一层的节点求和。
(1)弄一个最大值计数器,用来保存每一层的最大值
(2)while(!q.isEmpty())
q.isEmpty() 表示:q 这个列表为空(没有节点了)。
!q.isEmpty() 表示:q 不为空,还有节点要处理。
按层遍历的逻辑是:只要当前层还有节点,就继续循环;当 q 为空,说明没有下一层了,遍历结束。
List tmp = q;只是让 tmp 引用当前的 q(当前层)。
遍历 tmp(当前层)
q = new ArrayList<>();
随后把 q 换成新的空列表,用来装下一层节点。这样就能在循环里。
把孩子节点加到 q(下一层)
把计数器置为空,层级加一。
对当前层进行求和操作
遍历当前层的节点有左孩子,左孩子入队;遍历当前层的节点有右孩子,右孩子入队。
遍历结束后,用 maxSum 更新最大层和,并进入下一层。
3.代码实现
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{publicintmaxLevelSum(TreeNoderoot){if(root==null){return0;}//1.最大值intmaxSum=Integer.MIN_VALUE;//最后的结果变量intres=0;//q用来存当前层的节点List<TreeNode>q=newArrayList<>();//层级intlevel=0;//根节点入队q.add(root);//当前层节点不空while(!q.isEmpty()){List<TreeNode>tmp=q;//tmp存储当前层的节点q=newArrayList<>();//q置空,用来存储下一层的节点intsum=0;//sum 是当前层的和for(TreeNodenode:tmp){sum=sum+node.val;if(node.left!=null){q.add(node.left);}if(node.right!=null){q.add(node.right);}// level++;如果放在遍历节点数中,导致level数按节点数增加}level++;//按层级数增加if(sum>maxSum){maxSum=sum;res=level;}}returnres;}}