题目
难度中等
给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。
请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
思路
要想求得哪一层内的元素之和最大,就得遍历整棵树,按层把元素求和,最后比较每一层求和结果即可。
既然是按层求和元素,那么很自然就想到层序遍历,然后就可以使用广度优先搜索来完成这个任务。
直接使用广搜可以保证我们遍历的顺序是从低层到高层进行的,还需要额外记录一下节点的高度信息,可以 和 TreeNode 节点一起包装成新的结构体,然后放到队列里进行正常的广搜即可。
如果不想额外记录节点的层数,那么显然我们要将每一层的节点隔离开,可以使用两个动态数组 A 和 B ,A 中存放着当前层的所有节点,在遍历 A 求和当前层元素的同时,求得下一层的节点放入 B。A 数组统计完后将 B 数组中元素移入 A 中然后清空 B,重复上述操作即可。
实现
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxLevelSum(root *TreeNode) int {
q := []*TreeNode{root}
ans := 1
cur := 1
maxn := root.Val
for len(q) > 0 {
tmp := q;
q = nil
sum := 0
for i:=0; i<len(tmp); i++ {
// 得到下一层的节点
if tmp[i].Left != nil {
q = append(q, tmp[i].Left)
}
if tmp[i].Right != nil {
q = append(q, tmp[i].Right)
}
// 统计这一层的节点
sum += tmp[i].Val
}
if(sum > maxn) {
ans, maxn = cur, sum
}
cur++
}
return ans
}