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

92 阅读1分钟

题目描述

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

多说一嘴

这个排版真的好难用 而且每次复制题目过来都没有图片,难不成还得自己下吗 难顶

解题思路

  1. 很明显需要用层次遍历, 方法为将节点和孩子依次加入到队列中
  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
}