题目
题目来源:力扣(LeetCode)
给你一个二叉树的根节点 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
思路分析
方法:使用递归实现中序遍历
- 递归实现的中序遍历非常简单:遵循 Left->Node->Right 的顺序。例如:首先递归访问 左孩子, 然后访问父节点,再递归访问 右孩子。
- 遍历时需要记录当前层节点之和。
- 创建方法 inorder(node, level),实现递归的中序遍历。该方法输入当前节点和当前节点层级,然后递归更新 nodesArr[level]。
- 计算每层元素之和,返回符合要求的层级
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var maxLevelSum = function (root) {
// 二维数组,存储每层的节点
let nodesArr = []
// 递归实现的中序遍历
// 参数为 当前节点和当前节点层级
function inorder(node, level) {
if (!node) return
nodesArr[level] = nodesArr[level] || []
nodesArr[level].push(node.val)
inorder(node.left, level + 1)
inorder(node.right, level + 1)
}
inorder(root, 0)
let ans = []
// 计算每层的节点之和
for (let i = 0; i < nodesArr.length; i++) {
sum = nodesArr[i].reduce((sum, cur) => sum + cur)
ans.push(sum)
}
// 层内元素之和最大值
let max = Math.max(...ans)
// 返回层级
return ans.indexOf(max) + 1
};