Problem Description
- Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given sum.
Note: A leaf is a node with no children. Example :
problem analysis
- This question can be seen as LeetCode 112. Path Sum (find whether there is a path in a binary tree and a root-to-leaf path of sum) and LeetCode 257. Binary Tree Paths (find all the root-to-leaf paths in a binary tree path) combination and advancement. The problem is all paths in a binary tree and the root-to-leaf path of sum. The sword refers to the offer with the same topic, and the sword refers to the path in the offer-binary tree that sums to a certain value
- DFS + Backtracking
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<Integer> path = new ArrayList<>();
findPath(root, sum, path, res);
return res;//此时path和初始值一样,是[]
}
public void findPath(TreeNode root, int curSum, List<Integer> path, List<List<Integer>> res) {
path.add(root.val);
if (root.left == null && root.right == null) {
if (curSum - root.val == 0) {
res.add(new ArrayList<>(path));
}
}
if (root.left != null) {
findPath(root.left, curSum - root.val, path, res);
}
//若原path是[1,2,3],由于回溯的存在,对左子树执行完dfs之后,path依旧是[1,2,3]
if (root.right != null) {
findPath(root.right, curSum - root.val, path, res);
}
//回溯
path.remove(path.size() - 1);
}
}