// 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。// 叶子节点 是指没有子节点的节点。//// 示例 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// 解释:由于树是空的,所以不存在根节点到叶子节点的路径。/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*//*** @param {TreeNode} root* @param {number} targetSum* @return {boolean}*/// 题解,深度优先遍历求和,最大深度记录层级类似var hasPathSum = function (root, targetSum) {if (!root) { return false }let res = false;const dfs = (n, s) => {// 判断叶子节点if (n.left === null && n.right === null && s === targetSum) {res = true}if (n.left) { dfs(n.left, n.left.val + s) };if (n.right) { dfs(n.right, n.right.val + s) }}dfs(root, root.val)return res};
时间复杂度:O(n) 最差空间复杂度O(N) 均匀分布O(log N)
