【LeetCode】515. 在每个树行中找最大值
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 二叉树的节点个数的范围是
[0,104]
-231 <= Node.val <= 231 - 1
- 二叉树的节点个数的范围是
二、思路分析:
我们拿到本题,读取题意要求求出树中每一层的最大值,结果并返回一个列表。在动手实现前,我们需要继续对题目中的细节进行明确几点信息:
- 题目中的树都是以root为根节点的二叉树
- 二叉树中每一个节点的值范围在-231~231-1的范围
读完要求后,本题仍然是一道关于二叉树遍历的,那么与我们之前做过的513. 找树左下角的值题目类似。
思路大致仍然可以使用深度优先遍历算法(DFS)和广度优先遍历算法(BFS)两种方式。
- 深度优先遍历:可以直接使用递归方法快速实现
- 广度优先遍历:直接借助队列方法来实现
-
方法一:深度优先遍历法
由于本题是需要找到每一层的最大值,因此在遍历二叉树时,定义ans列表来存储答案
- ans列表中只存储每一层的最大值,因此ans列表的长度-1与二叉树深度是存在映射关系的
- 因此在每一次递归时判断二叉树层高与ans长度是相等时,则ans列表添加每一层的左节点的值
- 当height层高与ans长度不相等时,则取出ans[height]与root.val进行比较,取最值更新到ans列表
- 直到遍历完整个二叉树,root为None时,退出递归操作
class Solution(object): def largestValues(self, root): """ :type root: TreeNode :rtype: List[int] """ ans = [] def dfs(root,height): if root == None: return if height != len(ans): ans[height] = max(ans[height],root.val) else: ans.append(root.val) height +=1 dfs(root.left,height) dfs(root.right,height) dfs(root,0) return ans
-
方法二:广度优先遍历法
- 广度优先遍历中先把root添加到队列bfs中,定义一个tmp临时变量被赋值为bfs
- bfs重新清空,重新赋值为空列表
- 在每一次遍历的层级时,求出当前层级的最大值maxval,ans列表中添加maxval
- 在tmp列表遍历求最大值过程中,bfs添加node.left,node.right节点
class Solution(object): def largestValues(self, root): """ :type root: TreeNode :rtype: List[int] """ bfs = collections.deque() ans = [] bfs.append(root) if root is None: return [] while bfs: maxval = -2**32 tmp = bfs bfs = [] for node in tmp: maxval = max(maxval,node.val) if node.left != None: bfs.append(node.left) if node.right != None: bfs.append(node.right) ans.append(maxval) return ans
三、总结:
本题仍然考察二叉树深度遍历和广度遍历思想,在遍历二叉树过程中,对于深度遍历来说,二叉树的深度对应ans列表中的索引的关系,前序遍历过程前判断height与len(ans)长度,找出每一层的最大值。
对于广度遍历来说,每遍历一层时,通过临时列表把当前层的全部节点添加后,遍历tmp列表,求出当前层的最大值,以此类推。AC提交记录如下:
- 时间复杂度O(n),n为二叉树节点数量
- 空间复杂度O(n),存储二叉树的内存开销
以上是本期内容,欢迎大佬们点赞评论,下期见~~~
转载自:https://juejin.cn/post/7113003128785469476