题目链接
思路:
采用深度优先遍历来解。
需要尝试每一种可能,如果在遍历尝试的过程中,遇到了一个节点是叶子节点且从根节点到这个节点的当前路径的和等于目标值,那么将其加入到最终结果中,对于每一个节点,都需要分别尝试它的左子树和右子树。
例如:
sum = 22
上面这棵二叉树中,根节点为5,从根节点开始,向下进行尝试
先尝试左子树(也可以先右子树)
红色路径(5-4-11-7)上的总和为27,不符合条件,再看11的右子树
红色路径(5-4-11-2)上的总和为22,符合条件,添加进结果
此时,5的左子树已经全部遍历结束,开始右子树
红色路径(5-8-13)上的总和为26,不符合条件
回退到节点8,开始它的右子树
红色路径(5-8-4-5)上的总和为22,符合条件,添加进结果
回退到节点4,开始它的右子树
红色路径(5-8-4-1)上的总和为18,不符合条件
至此,遍历结束,结果为[5 4 11 2]和[5 8 4 5]
// 做加法
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) {
return ans;
}
dfs(root, sum, 0, new ArrayDeque<>(), ans);
return ans;
}
/**
*
* @param root 当前节点
* @param target 目标值
* @param curSum 当前路径总和
* @param path 当前路径
* @param ans 最终结果
*/
private void dfs(TreeNode root, int target, int curSum,
Deque<Integer> path, List<List<Integer>> ans) {
// 当前节点添加进路径
path.add(root.val);
// 当前路径和等于目标值且当前节点为叶子节点,当前路径符合条件,加入结果集中
if (curSum + root.val == target && root.left == null && root.right == null) {
ans.add(new ArrayList<>(path));
return;
}
// 当前节点左子树不为空,遍历
if (root.left != null) {
dfs(root.left, target, curSum + root.val, path, ans);
path.removeLast();
}
// 当前节点右子树不为空,遍历
if (root.right != null) {
dfs(root.right, target, curSum + root.val, path, ans);
path.removeLast();
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}