问题描述
- 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 :
问题分析
- 该题可以看做是 LeetCode 112. Path Sum (找一棵二叉树中是否存在路径和为sum 的 root-to-leaf path)和 LeetCode 257. Binary Tree Paths (找出二叉树中所有的root-to-leaf path) 的结合与进阶。该题是二叉树中所有的路径和为sum 的 root-to-leaf path。剑指offer有同样的题目,剑指offer-二叉树中和为某一值的路径
- DFS + 回溯
代码实现
/**
* 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);
}
}