携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 树中节点数目在范围
[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
根据以上思路,我们使用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提交记录如下:
- 时间复杂度:O(n),n为二叉树节点数
- 空间复杂度:O(n),需要对二叉树节点数遍历
以上是本期内容,欢迎大佬们点赞评论,下期见~~~