思路
这道题使用的是二叉树的DFS深度搜索,因为要得到的是从根节点到叶子节点的完整路径,所以使用深度优先遍历来遍历整个树的每一条完整路径,然后判断每条路径的路径和是否为target即可。
细节
- 本体要得到每一条完整路径,所以当遍历了一条路径之后,需要把已经算完之后的节点删掉,然后再去遍历另一边的节点,这样才能保证每条路径的唯一和不会多出已经算完的节点。
注意
- 本体需要注意得到完整路径,要一直遍历到叶子节点为止,所以判断结束的标志为:
root.left == null && root.right == null && target == 0
- 在添加最终的节点时,要new出来一个新的List来存放当前结果,否则得到的最终返回为空。
res.add(new ArrayList<>(list))
代码实现(java)
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int target) {
dfs(root, target, new ArrayList<>());
return res;
}
public void dfs(TreeNode root, int target, List<Integer> list) {
if (root == null) return;
target -= root.val;
list.add(root.val);
if (root.left == null && root.right == null && target == 0) {
res.add(new ArrayList<>(list));
} else {
if (root.left != null) dfs(root.left, target, list);
if (root.right != null) dfs(root.right, target, list);
}
list.remove(list.size() - 1);
}
}