一:题目描述:
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
二:示例与提示
示例 1:
1 2
| 输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]
|
示例 2:
1 2
| 输入:root = [1,2,3], targetSum = 5 输出:[]
|
示例 3:
1 2
| 输入:root = [1,2], targetSum = 0 输出:[]
|
提示:
- 树中节点的数目在范围
[0, 5000]
内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
三:思路
深度优先搜索和回溯
- 遍历每个节点的时候targetSum减去当前节点值,当遍历到叶子节点时候,如果targetSum为0,说明存在一条路径,满足该路径上的所有节点的和为targetSum
- 终止条件是遍历到叶子节点时,是否targetSum为0,如果满足存在该路径就把path加入到res结果集中,不存在就return 返回
- 如果不是叶子节点,递归调用,避免操作空指针,先判断是否存在左右子树,然后将该节点的val值加入到当前path路径中
- 重要的是回溯,在递归调用之后,将该值从 “path” 数组中移除(回溯),以便探索其他路径。
- “pathSum” 函数通过传入根节点、目标和减去根节点值(targetSum - root.val)以及初始路径(只包含根节点的值)来调用 “getPath” 函数。
四:代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
var pathSum = function(root, targetSum) { let res = [] if(!root) return res let path = [root.val] const getPath = (root, targetSum, path) => { if(!root.left && !root.right && targetSum === 0){ res.push([...path]); } if(!root.left && !root.right && !targetSum !== 0) { return } if(root.left) { path.push(root.left.val) getPath(root.left, targetSum - root.left.val, path) path.pop() } if(root.right) { path.push(root.right.val) getPath(root.right, targetSum - root.right.val, path) path.pop() } return } getPath(root, targetSum - root.val, path) return res
};
|