题目描述
给你一个二叉树的根节点 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
多说一嘴
这个排版真的好难用 而且每次复制题目过来都没有图片,难不成还得自己下吗 难顶
解题思路
- 很明显需要用层次遍历, 方法为将节点和孩子依次加入到队列中
- go语言的队列需要自己写,因此偷懒抄题解用了切片,每次加入元素使用append, 出队使用【size:】
解法如下
func maxLevelSum(root *TreeNode) int {
//使用切片做队列
queue := []*TreeNode{root}
//树节点有可能是负值
max := -1000000
//存结果要求的第x层
ans := 1
level := 1
for len(queue) > 0 {
sum := 0
//方便出入队设置的变量
size := len(queue)
for i := 0; i < size; i++ {
sum += queue[i].Val
if queue[i].Left != nil {
queue = append(queue, queue[i].Left)
}
if queue[i].Right != nil {
queue = append(queue, queue[i].Right)
}
}
if sum > max {
max = sum
ans = level
}
//出队 就是抛弃所有切片size之前的内容
queue = queue[size:]
level++
}
return level
}