题目:
给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。
请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
示例 1:
输入:root = [1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。
示例 2:
输入:root = [989,null,10250,98693,-89388,null,null,null,-32127]
输出:2
提示:
树中的节点数在 [1, 104]范围内
-105 <= Node.val <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-level-sum-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案:
/**
* 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;
* }
* }
*/
// class Solution {
// public int maxLevelSum(TreeNode root) {
// int a=0;//记录第a层
// int b=0;
// int len = root.length;
// int max=0,sum=0;
// for(int i=1;i<len;i*=2){
// b++;
// int floorLen = 2^(b-1);
// for(int j=i;i<=floorLen;j++){
// sum+=root[j];
// }
// if(sum>max){
// max=sum;
// a=b;
// }else if(sum = max){
// }
// }
// }
// }
class Solution {
private List<Integer> sum = new ArrayList<Integer>();//新建一个可以动态修改的数组
public int maxLevelSum(TreeNode root) {//元素之和最大的层数
dfs(root, 0);
int ans = 0;
for (int i=0; i<sum.size();++i) {
if (sum.get(i) > sum.get(ans)) {
ans = i;
}
}
return ans + 1; // 层号从 1 开始
}
private void dfs(TreeNode node, int level) {
//实际执行内容
if (level == sum.size()) {//size返回元素数量
sum.add(node.val);
}
else {
sum.set(level, sum.get(level)+node.val);//set替换指定元素 get通过索引获取元素
}
//迭代条件
//树的左右不为空就继续迭代
if (node.left != null) {
dfs(node.left, level + 1);
}
if (node.right != null) {
dfs(node.right, level + 1);
}
}
}
思路:
通过在ArrayList动态数组以迭代的方式添加元素(即求sum)得每层之间的加和,之后通过for循环依次比较每个层数之间的加和来筛选出最大的。
解惑:
如果同时出现多个一样的“最大值”,则利用动态数组存储可保证最大值得到保存,并可进行输出。