剑指 Offer 34. 二叉树中和为某一值的路径

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

img

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:

img

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

思路:(DFS+回溯)

  • 递归出口:叶子结点,root == null
  • 递归步骤:
    • 将当前值加入路径path
    • 更新目标值target
    • 记录满足条件的路径
    • 递归调用左右子树
    • 回溯

代码实现:

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
List<List<Integer>> res = new LinkedList<List<Integer>>();
Deque<Integer> path = new LinkedList<Integer>();

public List<List<Integer>> pathSum(TreeNode root, int target) {
dfs(root, target);
return res;
}
//深度优先遍历
public void dfs(TreeNode root, int target) {
//递归出口
if (root == null) {
return;
}
//将当前节点值加入到路径中
path.offerLast(root.val);
//更新target的值
target = target - root.val;
//找到了一条和为target的路径
if (target == 0 && root.left == null && root.right == null) {
res.add(new LinkedList<Integer>(path));
}
//递归遍历左右子树
dfs(root.left, target);
dfs(root.right, target);
//回溯
path.pollLast();
}