• 算法 - 路径总和


    目录

    题目来源

    题目描述

    输入输出

    题目解析

    算法源码


    题目来源

    112. 路径总和 - 力扣(LeetCode)

    题目描述

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

    叶子节点 是指没有子节点的节点。

    提示:

    树中节点的数目在范围 [0, 5000] 内
    -1000 <= Node.val <= 1000
    -1000 <= targetSum <= 1000

    输入输出

    示例1:

    输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
    输出:true
    解释:等于目标和的根节点到叶节点路径如上图所示。

    示例2:

    输入:root = [1,2,3], targetSum = 5
    输出:false
    解释:树中存在两条根节点到叶子节点的路径:
    (1 --> 2): 和为 3
    (1 --> 3): 和为 4
    不存在 sum = 5 的根节点到叶子节点的路径。

    示例3:

    输入:root = [], targetSum = 0

    输出:false

    解释:由于树是空的,所以不存在根节点到叶子节点的路径。

    题目解析

    我一开始看到这道题示例中二叉树图片和输入的root数组是懵逼的,root数组是怎么转成图片所示的二叉树的呢?

    后面一看leetcode的的编辑器的提示代码

    搞了半天,hasPathSum的入参root不是示例输入中给的数组,而是直接传了生成好的二叉树对象。吓我一跳,虚惊一场。

    那么接下来就是处理路径总和的问题了,其实思路也很简单,从根节点的开始比较root.val 和 targetSum的值,如果不相等,则继续递归遍历root.left,和root.right,即将root.left和root.right当成新的根节点,但是此时targetSum = targetSum - root.val,如此递归比较,如果最终都不存在相等的情况,则返回false,如果存在相等了,则此时不能直接返回true,因为题目要求是:

    是否存在 根节点到叶子节点 的路径。

    叶子节点 是指没有子节点的节点

    因此,如果发现相等情况,则还要判断发生相等的节点是否为叶子节点,若不是,则也不能算合理路径。

    比如

    root =  [1,2]
    targetSum = 1

     咋一看,似乎应该返回true,因为1可以自身当成全部路径的化,其targetSum就是1,但是可惜的是1不是叶子节点。

    算法源码

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @param {number} targetSum
    12. * @return {boolean}
    13. */
    14. var hasPathSum = function(root, targetSum) {
    15. if(!root) return false
    16. if(!root.left && !root.right) {
    17. return root.val === targetSum
    18. }
    19. targetSum = targetSum - root.val
    20. return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum)
    21. };

    注意,上面代码只能在leetCode编辑器中运行,因为上面函数root入参不是示例中的数组,而是leetcode后台帮我们生成好的二叉树对象 

  • 相关阅读:
    自定义 Hook(State Hook)_web前端培训
    汽车电子专栏目录一览
    IDEA-SVN合并分支到主干
    【Java】java | jvm | 分析cpu占用过高 | 分析jvm堆栈信息
    uniapp本地存储的几种方式
    Windows-vscode安装与简单配置
    Rust 基础(六)
    地图与WebGIS、地图的作用、数字地图的应用
    Linux提权一
    C++类构造函数和析构函数
  • 原文地址:https://blog.csdn.net/qfc_128220/article/details/127133125