437.路径总和III
给定一个二叉树的根节点 root
,和一个整数 targetSum
,求该二叉树里节点值之和等于 targetSum
的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 输出:3 解释:和等于 8 的路径有 3 条,如图所示。
示例 2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:3
提示:
- 二叉树的节点个数的范围是
[0,1000]
-109 <= Node.val <= 109
-1000 <= targetSum <= 1000
方法一:dfs
时间复杂度:O(N2)
空间复杂度:O(N)
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 {number} 13 */ 14 15 var psthSum = function(root, targetSum) { 16 if (root === null) { 17 return 0; 18 } 19 let ret = rootSum(root, targetSum); 20 ret += pathSum(root.left, targetSum); 21 ret += pathSum(root.right, targetSum); 22 return ret; 23 } 24 25 const rootSum = (root, targetSum) => { 26 let ret = 0; 27 if (root === null) { 28 return 0; 29 } 30 const val = root.val; 31 if (val === targetSum) { 32 ret++; 33 } 34 ret += rootSum(root.left, targetSum - val); 35 ret += rootSum(root.right, targetSum - val); 36 return ret; 37 }
方法二:前缀和
时间复杂度:O(N)
空间复杂度:O(N)
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 {number} 13 */ 14 15 var psthSum = function(root, targetSum) { 16 const prefix = new Map(); 17 prefix.set(0, 1); 18 return dfs(root, prefix, 0, targetSum); 19 const dfs = (root, prefix, curr, targetSum); 20 } 21 const dfs = (root, prefix, curr, targetSum) => { 22 if (root === null) { 23 return 0; 24 } 25 let ret = 0; 26 curr += root.val; 27 ret = prefix.get(curr - targetSum) || 0; 28 prefix.set(curr, (prefix.get(curr) || 0) + 1); 29 ret += dfs(root.left, prefix, curr, targetSum); 30 ret += dfs(root.right, prefix, curr, targetSum); 31 prefix.set(curr, (prefix.get(curr) || 0) - 1); 32 return ret; 33 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理