题目:
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
For example:Given the below binary tree and
sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
return
[ [5,4,11,2], [5,8,4,5] ]
答案:
典型的DFS,可以用回溯的方式去解。
参考代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> ans = new ArrayList<>();
if (root != null) {
List<Integer> cur = new ArrayList<>();
cur.add(root.val);
solve(ans, root, sum, cur);
}
return ans;
}
private void solve(List<List<Integer>> ans, TreeNode root, int sum, List<Integer> cur) {
if (root.left == null && root.right == null) {
if (root.val == sum) {
ans.add(new ArrayList<>(cur));
}
} else {
if (root.left != null) {
cur.add(root.left.val);
solve(ans, root.left, sum - root.val, cur);
cur.remove(cur.size()-1);
}
if (root.right != null) {
cur.add(root.right.val);
solve(ans, root.right, sum - root.val, cur);
cur.remove(cur.size()-1);
}
}
}
}
延伸思考:如果不要求一定是根到叶子的路径,而是任意两个节点的路径应该怎么解呢?
参考解法:(代码没有经过测试)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> ans = new ArrayList<>();
if (root != null) {
ArrayList<Integer> sums = new ArrayList<>();
sums.add(0); // 可以添加任意一个值
solve(ans, root, new ArrayList<>(), sums, sum);
}
return ans;
}
private void solve(List<List<Integer>> ans, TreeNode root, List<Integer> cur, List<Integer> sums, int target) {
if (root != null) {
cur.add(root.val);
int newSum = root.val + sums.get(sums.size()-1);
for (int i = 0; i < sums.size(); i++) {
if (newSum - sums.get(i) == target) {
ans.add(new ArrayList<>(cur.subList(i, cur.size())));
}
}
sums.add(newSum);
solve(ans, root.left, cur, sums, target);
solve(ans, root.right, cur, sums, target);
sums.remove(sums.size() - 1);
cur.remove(cur.size() - 1);
}
}
}