【LeetCode】1302. 二叉树层数最深叶子节点的和

114 阅读2分钟

image.png

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

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

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

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 树中节点数目在范围 [1, 104] 之间。
    • 1 <= Node.val <= 100

二、思路分析:

我们拿到本题,又是一道关于二叉树的题目,读取题目要求找到层数最深的叶子🍃点和。回顾我们之前做过的515. 在每个树行中找最大值有一曲同工之处。

二叉树🌲的遍历主要是两种深度优先遍历DFS和广度优先遍历BFS。

  • 深度优先遍历:递归方法;分为前序遍历、中序遍历和后序遍历
  • 广度优先遍历:while遍历每一层

因此,本题我们仍然使用深度遍历和广度遍历两种方法模拟实现,思路如下:

  • 方法一:深度优先遍历

    • 定义一个ans列表,ans[0]存储二叉树高度,ans[1]存储二叉树节点值
    • 使用前序遍历(根->左->右),定义dfs递归函数,当root为空则return
    • 当height大于ans[0]时,ans[0]被赋值为height值,ans[1]被赋值为root.val
    • 当height与ans[0]相等时,则ans[1] = ans[1] + root.val
      流程图 (9).jpg 根据以上思路,我们使用Python能快速实现,代码如下:
      class Solution(object):
          def deepestLeavesSum(self, root):
              """
              :type root: TreeNode
              :rtype: int
              """
      
              def dfs(root,height):
                  if not root:
                      return
                  if height > ans[0]:
                      ans[0],ans[1] = height,root.val
                  elif height == ans[0]:
                      ans[1] += root.val
                  height +=1
                  dfs(root.left,height)
                  dfs(root.right,height)
              ans = [-1,0]
              dfs(root,0)
              return ans[1]
      
  • 方法二:广度优先遍历

    • 广度优先遍历是按照每一层遍历完后再遍历下一层,直到队列里面的节点遍历完为止
    • 定义一个以root节点开始的数组bfs
    • 广度优先遍历使用while遍历,每一次遍历就是每一层遍历完,因此定义ans为0
    • 使用tmp存储bfs数组的节点,并将bfs数组清空存储下一层的节点
    • 使用for循环遍历tmp中的节点,ans与tmp的节点进行累计和,并判断其左右节点情况,若不空则添加到bfs列表中
    • 直到bfs为空,则说明已经遍历完最后一层则退出循环前一次ans结果就是最后一层的节点和
      class Solution(object):
          def deepestLeavesSum(self, root):
              """
              :type root: TreeNode
              :rtype: int
              """
              bfs = [root]
              if not root:
                  return 
              while bfs:
                  ans = 0
                  tmp = bfs
                  bfs = []
                  for node in tmp:
                      ans += node.val
                      if node.left:
                          bfs.append(node.left)
                      if node.right:
                          bfs.append(node.right) 
              return ans   
      

三、总结:

本题仍然是一道关于二叉树遍历的问题,二叉树的遍历深度遍历和广度遍历两种方法,在实际运用过程中,递归和while两种方法都要掌握,AC提交记录如下:

image.png

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

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