【LeetCode】515. 在每个树行中找最大值

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 二叉树的节点个数的范围是 [0,104]
    • -231 <= Node.val <= 231 - 1

二、思路分析:

我们拿到本题,读取题意要求求出树中每一层的最大值,结果并返回一个列表。在动手实现前,我们需要继续对题目中的细节进行明确几点信息:

  • 题目中的树都是以root为根节点的二叉树
  • 二叉树中每一个节点的值范围在-231~231-1的范围

读完要求后,本题仍然是一道关于二叉树遍历的,那么与我们之前做过的513. 找树左下角的值题目类似。

思路大致仍然可以使用深度优先遍历算法(DFS)和广度优先遍历算法(BFS)两种方式。

  1. 深度优先遍历:可以直接使用递归方法快速实现
  2. 广度优先遍历:直接借助队列方法来实现
  • 方法一:深度优先遍历法

    由于本题是需要找到每一层的最大值,因此在遍历二叉树时,定义ans列表来存储答案

    • ans列表中只存储每一层的最大值,因此ans列表的长度-1与二叉树深度是存在映射关系的
    • 因此在每一次递归时判断二叉树层高与ans长度是相等时,则ans列表添加每一层的左节点的值
    • 当height层高与ans长度不相等时,则取出ans[height]与root.val进行比较,取最值更新到ans列表
    • 直到遍历完整个二叉树,root为None时,退出递归操作

    流程图 (3).jpg

    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节点

    流程图 (4).jpg

    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提交记录如下:

image.png

  • 时间复杂度O(n),n为二叉树节点数量
  • 空间复杂度O(n),存储二叉树的内存开销

以上是本期内容,欢迎大佬们点赞评论,下期见~~~

猜你喜欢

转载自juejin.im/post/7113003128785469476