【07.31 每日一题】1161. 最大层内元素和

93 阅读2分钟

1161. 最大层内元素和

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

思路

  • 本题要求“每层的层内元素之和最大,但是层序号最小的”,这么一看,以层为研究对象,首先想到最熟悉,自然的解题方式是广度遍历(BFS),使用层序遍历。
  • 具体的做法:以层为单位拓展,计算每层的要元素之和,并不断维护处理过程中的最大元素和,以及层数序号。

解法

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxLevelSum(root *TreeNode) int {
    queue:=[]*TreeNode{}
    queue=append(queue,root)
    maxSum:=root.Val
    res:=1
    index:=0
    for len(queue)>0{
        level:=len(queue) // 当前层的元素数量
        sum:=0 // 保存当前层的元素之和
        for i:=0;i<level;i++{ // 遍历当前层的元素,并不断将当前层的子节点入队,以及自己的出队
            node:=queue[0]
            sum=sum+node.Val
            if node.Left!=nil{
                queue=append(queue,node.Left)
            }
            if node.Right!=nil{
                queue=append(queue,node.Right)
            }
            queue=queue[1:]
        }
        index=index+1
        if sum>maxSum{ // 维护最大元素之和
            maxSum=sum
            res=index
        }
    }
    return res
}

结果

image.png

..........................................................................................................................................................................................

思路

  • 使用深度遍历(DFS)的思想,定义一个map,key为层数,value为当前层的元素之和。不断向深层次遍历。从结果上看,有点以空间换时间的意思。

解法二

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxLevelSum(root *TreeNode) int {
    dic:=map[int]int{}
    var dfs func(*TreeNode,int)
    dfs=func(node *TreeNode,level int){
        if node==nil{
            return 
        }
        dic[level]=dic[level]+node.Val
        if node.Left!=nil{
            dfs(node.Left,level+1)
        }
        if node.Right!=nil{
            dfs(node.Right,level+1)
        }
    }
    dfs(root,0)
    res:=0
    maxSum:=root.Val
    for k,v:=range dic{
        if v>maxSum{
            maxSum=v
            res=k
        }
    }
    return res+1
}

结果

image.png

思路

  • 上面使用map,空间有点浪费,继续使用深度遍历(DFS)的思想,定义一个数组,k索引为层数,value为当前层的元素之和。不断向深层次遍历。

解法三

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxLevelSum(root *TreeNode) int {
    nodes:=[]int{}
    var dfs func(*TreeNode,int)
    dfs=func(node *TreeNode,level int){
        if node==nil{
            return 
        }
        if level==len(nodes){
            nodes=append(nodes,node.Val)
        }else{
            nodes[level]=nodes[level]+node.Val
        }
        if node.Left!=nil{
            dfs(node.Left,level+1)
        }
        if node.Right!=nil{
            dfs(node.Right,level+1)
        }
    }
    dfs(root,0)
    res:=0
    maxSum:=root.Val
    for k,v:=range nodes{
        if v>maxSum{
            maxSum=v
            res=k
        }
    }
    return res+1
}

结果

image.png