1. 题目描述
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
2. 实现思路
可以使用深度优先遍历来实现:
- 首先,遍历到节点时,将当前节点的值放入到一个数组中
- 分别遍历左右子节点,遍历时sum将去当前值,就等于后面还需要相加的和
- 如果当前节点没有左右子节点,并且当前节点的值与还需要相加的值相等,就将暂存路径值的数组arr的值保存到结果数组中
最后不要忘了每次遍历完,将暂存路径节点的数组做出数组操作。以此进行回溯操作。
3. 代码实现
```javascript /**
- Definition for a binary tree node.
- function TreeNode(val) {
- this.val = val;
- this.left = this.right = null;
- } / /*
- @param {TreeNode} root
- @param {number} sum
@return {number[][]} */ var pathSum = function(root, sum) { let res = []
fn(root, sum, res, []) return res };
function fn(root, sum, res, arr){ if(!root) return arr.push(root.val) // 当节点没有左右子树的时候,并且根节点等于当前的sum值时,就将当前路径的值保存在结果中 if(!root.left && !root.right && root.val === sum){ res.push([…arr]) } fn(root.left, sum - root.val, res, arr) fn(root.right, sum - root.val, res, arr) arr.pop() // 将当前节点出数组 } ```