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
}
结果
..........................................................................................................................................................................................
思路
- 使用深度遍历(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
}
结果
思路
- 上面使用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
}