1. // 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
    2. // 叶子节点 是指没有子节点的节点。
    3. //
    4. // 示例 1:
    5. // 输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
    6. // 输出:true
    7. // 解释:等于目标和的根节点到叶节点路径如上图所示。
    8. // 示例 2:
    9. // 输入:root = [1,2,3], targetSum = 5
    10. // 输出:false
    11. // 解释:树中存在两条根节点到叶子节点的路径:
    12. // (1 --> 2): 和为 3
    13. // (1 --> 3): 和为 4
    14. // 不存在 sum = 5 的根节点到叶子节点的路径。
    15. // 示例 3:
    16. // 输入:root = [], targetSum = 0
    17. // 输出:false
    18. // 解释:由于树是空的,所以不存在根节点到叶子节点的路径。
    19. /**
    20. * Definition for a binary tree node.
    21. * function TreeNode(val, left, right) {
    22. * this.val = (val===undefined ? 0 : val)
    23. * this.left = (left===undefined ? null : left)
    24. * this.right = (right===undefined ? null : right)
    25. * }
    26. */
    27. /**
    28. * @param {TreeNode} root
    29. * @param {number} targetSum
    30. * @return {boolean}
    31. */
    32. // 题解,深度优先遍历求和,最大深度记录层级类似
    33. var hasPathSum = function (root, targetSum) {
    34. if (!root) { return false }
    35. let res = false;
    36. const dfs = (n, s) => {
    37. // 判断叶子节点
    38. if (n.left === null && n.right === null && s === targetSum) {
    39. res = true
    40. }
    41. if (n.left) { dfs(n.left, n.left.val + s) };
    42. if (n.right) { dfs(n.right, n.right.val + s) }
    43. }
    44. dfs(root, root.val)
    45. return res
    46. };

    时间复杂度:O(n) 最差空间复杂度O(N) 均匀分布O(log N)