leetcode-1161. 最大层内元素和

137 阅读1分钟

题目

1161. 最大层内元素和

难度中等

给你一个二叉树的根节点 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
}