面试经典150题——路径总和

a mountain range with a lake in the foreground

1. 题目描述

image-20240424100450993

2.  题目分析与解析

2.1 思路一

注意题目的关键点:判断该树中是否存在 根节点到叶子节点 的路径,起点是root,终点是叶子节点。

那么我们就可以从根节点按照层序遍历的方式,从根节点从根到 叶子不断对路径进行加和(注意:层序遍历需要使用一个队列存储每一层的节点),就可以按照如下步骤进行:

image-20240424102221897

image-20240424102229888

最后发现当前层有叶子节点的值是targetSum就说明返回true,否则返回false。

2.2 思路二

因为我们在思路一按照层序遍历,不可避免地使用了一个存储当前层级的队列,那么能不能不用队列也能实现呢?答案是可以的。

因为我们已经有了targetSum,并且我们在从根节点向下遍历的过程中,如果要实现从root到某一个叶子节点的路经总和为targetSum,那么我们是不是也就相当于我从根节点root走到下一个节点root.left或者root.right,剩下的路径距离 targetSum - root.val?也就是按照先序遍历的方式,每走过一段路就用 targetSum - 当前节点的.val 最后到达叶子节点判断是否剩余路径等于此时的targetSum就可以了。

3. 代码实现

3.1 思路一

image-20240424103128281

image-20240424103109715

3.2 思路二

image-20240424104108243

image-20240424104058477

4. 相关复杂度分析

4.1 方法 hasPathSum (BFS 使用队列)

时间复杂度
  • 最坏情况: 在最坏的情况下,需要遍历树中的每一个节点。因此,时间复杂度为 (O(N)),其中 (N) 是树中节点的数量。

  • 最佳情况: 如果你在树的较浅层就找到了符合条件的路径,你可能不需要遍历所有节点。但理论上,这依然保持 (O(N)),因为在最坏情况下你需要遍历所有节点。

空间复杂度
  • 空间复杂度: 由于使用了队列来存储每一层的节点,空间复杂度主要取决于树的宽度(即最宽的那层有多少个节点)。在最坏的情况下(完全二叉树),最底层大约包含 (N/2) 个节点,因此空间复杂度也是 (O(N))。

2. 方法 hasPathSum2 (DFS 使用递归)

时间复杂度
  • 时间复杂度: 与 BFS 方法类似,DFS 方法在最坏情况下也需遍历树的每一个节点来确认是否存在符合条件的路径,因此时间复杂度也是 (O(N))。

空间复杂度
  • 空间复杂度: 递归方法的空间复杂度主要由递归调用栈的深度决定,这取决于树的高度。在最坏情况下(树完全不平衡,如退化成链表),空间复杂度为 (O(N))。在最好的情况下(树完全平衡),空间复杂度为 (O(\log N))。

总结来说,两种方法在时间复杂度上都是 (O(N)),而在空间复杂度上,DFS在最好情况下优于BFS,因为平衡树的高度远小于节点数。BFS由于需要存储至少一整层的节点,所以在空间上可能消耗更多,特别是在树的层次较多时。

相关推荐

  1. 面试经典 150 -- 数组 / 字符串 (总结)

    2024-04-24 15:40:07       44 阅读
  2. 面试经典 150

    2024-04-24 15:40:07       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-24 15:40:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-24 15:40:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-24 15:40:07       82 阅读
  4. Python语言-面向对象

    2024-04-24 15:40:07       91 阅读

热门阅读

  1. 通过easyExcel实现表格的导入导出

    2024-04-24 15:40:07       71 阅读
  2. 视频下载为什么需要大带宽服务器?

    2024-04-24 15:40:07       177 阅读
  3. antd-vue - - - - - a-config-provider全局配置中英文切换

    2024-04-24 15:40:07       85 阅读
  4. 1079:计算分数加减表达式的值

    2024-04-24 15:40:07       34 阅读
  5. 8 个必须要知道的Python装饰器

    2024-04-24 15:40:07       33 阅读
  6. 如何看待AIGC技术?

    2024-04-24 15:40:07       43 阅读
  7. 从零学算法127

    2024-04-24 15:40:07       35 阅读
  8. VIM插件安装与配置

    2024-04-24 15:40:07       30 阅读
  9. 虚拟化+docker概念

    2024-04-24 15:40:07       38 阅读
  10. 大数据环境下的隐私安全的图像特征提取及应用

    2024-04-24 15:40:07       44 阅读