携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
本次刷题日记的第 81 篇,力扣题为:1161. 最大层内元素和
一、题目描述:
题目描述文字较少,看一眼大概知道是要说什么,但是我们需要采取什么样的方式来处理的,咱们继续往下看
二、这道题考察了什么思想?你的思路是什么?
- 题目给予我们一个基本概念,二叉树的层次,从根节点开始是第 1 层,逐个往下递增 1
- 题目要求我们找到节点和最大的那一层,并返回层数
分析
我们可以知道,按照题目意思,其实已经非常明确了,需要我们计算每一层的节点和,再逐层去比较,返回节点和最大的那一层的层级数
看到题目的描述,第一反应是会先到二叉树的层序遍历来进行处理,因为确实是有点条件反射了
当然,对于能够使用广度优先算法 BFS 的地方,自然也是可以是深度优先算法 DFS 的方式的,自然,反过来也是成立的,只不过是这两种方式扩展的方向不同,一个是深度优先,一个是广度优先,目的只有一个,那就是遍历完全整棵树
那么我们来模拟一下示例:
根据简图,我们可以清晰的看到每一层是如何入队列,以及 maxSum 和 resLevel 的更新情况,题目相对比较好理解,也比较简单,这演示的是层序遍历,当然如果想用深度优先算法来实现的话也是可以的,动起手来吧
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
此处需要注意我们使用的是二叉树的层序遍历方式,我们需要计算每一层的最大值,并且挨个比较,分为如下几步:
- 每一层节点入队列
- 遍历队列里节点的时候,计算本层节点的数据和
- 判断本层数据和与 maxSum 比较,若比他大则取而代之
- 最终返回 maxSum 对应的层级位置
编码如下:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxLevelSum(root *TreeNode) int {
// 使用层序遍历的方式更加容易让人想到
// 初始化结果最大值的层为 1
resLevel, maxSum := 1, root.Val
que := []*TreeNode{root}
for level := 1; len(que) > 0; level++ {
tmp := que
que = nil
// 开始遍历每一层的节点
tmpSum := 0
for _,node := range tmp {
tmpSum += node.Val
// 开始将当前节点的子节点加入到 que 中
if node.Left != nil {
que = append(que, node.Left)
}
if node.Right != nil {
que = append(que, node.Right)
}
}
// 开始判断当前层的总和与 maxSum 谁大
if tmpSum > maxSum {
resLevel = level
maxSum = tmpSum
}
}
return resLevel
}
四、总结:
本次的解法,使用的是二叉树的层序遍历,BFS,时间复杂度为 O(n) ,因为我们遍历了二叉树的所有节点,这个 n 表示二叉树的节点
空间复杂度也是 O(n) ,因为咱们占用的空间消耗最差的情况是属于 O(n) 级别的
原题地址:1161. 最大层内元素和
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
无法复制加载中的内容