【LeetCode】1161. 二叉树最大层内元素和

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

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

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

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 树中的节点数在 [1, 104]范围内
    • -105 <= Node.val <= 105

二、思路分析:

我们拿到本题,读取题目仍然是一道关于二叉树,要求二叉树的每一层进行求和,返回值最大的层数。这个题目与之前我们做过的二叉树中找到每一层最大值(515. 在每个树行中找最大值 ),有异曲同工之处。

话不多说,面对二叉树题目,渐入佳境的我们开始重拳出击啦,让我们再次来巩固一下深度遍历和广度遍历的方法。

  • 方法一: 深度优先遍历(dfs)递归

    • 使用dfs方法中常用就有前、中、后序三种遍历,本题中我们直接使用前序遍历即可
    • 由于需要与二叉树的层数紧密关联的,因此我们需要定一个列表ans来存储每一层的元素和
    • 列表ans的长度与二叉树的高度是一致的,通过len(ans)==height时,ans.append(root.val)
    • 当len(ans)!=height时,则开始进行求和运算,覆盖原先的值
    • height深度+1,继续递归添加root的左右孩子,直到root为空时,进行退出递归
    • 我们通过上述思路,画图推理过程如下:
      流程图 (6).jpg 根据以上思路,使用Python代码如下所示:
      class Solution(object):
          def maxLevelSum(self, root):
              """
              :type root: TreeNode
              :rtype: int
              """
              ans = []
              def dfs(root,height):
                  if not root:return
                  if len(ans) == height:
                      ans.append(root.val)
                  else:
                      ans[height] += root.val
                  height +=1
                  dfs(root.left,height)
                  dfs(root.right,height)
      
              dfs(root,0)
              return ans.index(max(ans))+1
      
      复制代码
  • 方法二:广度优先遍历(bfs)

    • 广度优先遍历是使用队列与while结合,对二叉树每一层节点分批处理
    • 定义初始化ans为1,maxSum为root.val,level值为1
    • 定义一个以root节点开始的队列bfs,bfs赋值给临时数组tmp,bfs列表清空,for循环遍历tmp的所有节点值进行求和Sum,并使用清空的bfs列表添加节点的左右孩子
    • 当Sum大于初始的maxSum时,则ans,maxSum重新被赋值为level,Sum
    • Level深度+1,直到bfs为空为止,退出while循环

    流程图 (7).jpg

    class Solution(object):
        def maxLevelSum(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            ans,maxSum = 1,root.val
            level = 1
            bfs = [root]
            while bfs:
                Sum = 0
                tmp =bfs
                bfs = []
                for node in tmp:
                    Sum += node.val
                    if node.left:
                        bfs.append(node.left)
                    if node.right:
                        bfs.append(node.right)
                if Sum > maxSum:
                    ans,maxSum = level,Sum
                level +=1
            return ans
    复制代码

三、总结:

本题仍然考察二叉树深度遍历和广度遍历方法,同时对遍历过程中需要对每一层的元素值进行求和处理,AC记录如下:

image.png

  • 时间复杂度:O(n),n为二叉树节点数
  • 空间复杂度:O(n),需要对二叉树节点数遍历

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

猜你喜欢

转载自juejin.im/post/7127612699717926948