持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
本次刷题日记的第 76 篇,力扣题为:515. 在每个树行中找最大值 ,中等
一、题目描述:
又是一个在二叉树中查找数据的题,515. 在每个树行中找最大值 , 看看我们可以如何找
二、这道题考察了什么思想?你的思路是什么?
- 在每个树行中找最大值,给我们提出了哪些要求,具体来查看一下:
- 题目给出一颗二叉树,树上的节点存储的是整型的数字,有正数有负数
- 要求我们找到每一层的所有节点中的最大值,并存入结果集中,最后返回这棵树每一层的最大值节点值
分析
题目简洁,要求也很明确,实际上也很容易做
看到题目要求的是找到每一层的的最大值,其实第一反应还是想到的是层序遍历的方式,也就是广度优先算法来处理这道题
我们知道,是用广度优先算法遍历二叉树,实际上就是使用队列的方式,将二叉树的所有节点逐个加入到队列中,然后再逐个节点出队,知道队列为空,咱们就完成了一次二叉树的遍历
那么对应到本题,咱们需要如何去实现呢?
以前使用广度优先算法遍历二叉树,我们都是一个节点一个节点的入队和出队,这一次因为我们需要找到一层节点中的最大值
因此我们需要一层一层节点的出队,并计算最大值
从上图中,我们可以很清晰的知道,如果我们按照先让二叉树的左子树入队,再让右子树入队的话,那么就会上述我们看到的效果
当拿到每一层的所有节点的时候,计算最小值,岂不是一个很简单的事情了
那么,之前我们也说到过,能够使用深度优先算法的地方,必然是可以使用广度优先算法的,那么在这里也是同样的道理,能够使用广度优先算法的地方,必然也是可以使用深度优先算法的
关于 DFS 如何去实现这道题,兄弟们就可以思考一波
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
编码的时候需要注意的是,咱们出队需要一层一层的出队,然后再计算这一层中数值最大的一个节点,并加入到结果集
编码如下:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func largestValues(root *TreeNode) []int {
if root == nil{
return []int{}
}
// 保证 root 节点是有有效的
que := []*TreeNode{root}
var res []int
for len(que) > 0 {
// 将每一层的节点都给到 tmp
tmp := que
que = nil
maxVal := math.MinInt32
// 遍历 tmp ,且找到这一层的最大值
for _,node := range tmp {
maxVal = max(maxVal, node.Val)
if node.Left != nil{
que = append(que, node.Left)
}
if node.Right != nil {
que = append(que, node.Right)
}
}
res = append(res, maxVal)
}
return res
}
func max(a,b int) int {
if a > b {
return a
}
return b
}
四、总结:
很明显,时间复杂度是 O(n) ,咱们使用广度优先算法,是将二叉树的每一个节点全部遍历了一遍
空间复杂度,这里我们可以看到,我们创建的 tmp 会存储每一层的节点数据,且 res 记录了每一层的最大值,总的来说,占用了 O(n) 级别的空间消耗,则空间复杂度是 O(n)
原题地址:515. 在每个树行中找最大值
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~
暂时无法在飞书文档外展示此内容