113 .给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:[]
示例 3:
输入:root = [1,2], targetSum = 0
输出:[]
- 我的思路:不用想,看到树,看到路径,不 dfs 等什么。接下来就是入参,root 肯定是要的,不然我都不知道我遍历到哪个节点了,然后要计算路径伤的和,肯定也需要一个 int 变量。接下来就是递归的出口,首先如果遍历到节点都为 null 了,那肯定是要返回了,其次根据题意如果遍历到叶子结点,路径和是我们要的,那就把这一条路径添加到结果 list 中。递归内容就是不断更新 root 以及计算的路径和了
java
List<List<Integer>> ans = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
dfs(root,targetSum);
return ans;
}
void dfs(TreeNode root, int sum){
if(root==null)return;
list.add(root.val);
sum-=root.val;
if(root.left==null && root.right==null && sum==0)
// 防止 ans 中的路径随递归继续改变
ans.add(new ArrayList(list));
dfs(root.left,sum);
dfs(root.right,sum);
// 路径恢复
list.remove(list.size()-1);
}
- 由于路径不一定正确,所以肯定是需要路径恢复的。但是还有一点很关键的,就是 sum 必须在 ans 添加路径前先计算出来