做本题之前可以先做一下 二叉树中和为某一值的路径(一)。

深度优先遍历+回溯

1、首先,深度优点遍历来说,先写上一个回溯 if (root== null) { return false; },这表示递归至最深层开始回溯。
2、每次进入函数时,将 sum 减去当前节点的权重(root.val),当 sum 减到零时,说明目标路径存在,另外我们的目标是到叶子节点停止,叶子节点的条件是 root.left == null && root.right == null,所以说当 root.left == null && root.right == null && sum== 0同时满足才符合条件 ,返回 true 表示找到目标路径。(root.left == null && root.right == null 没有这两个是不算的
3、dfs分支:对于当前节点 root有两个分支,这两个分支都有可能成为目标路径,所以深度优先遍历的写法为 return dfs(curNode.left, target) || dfs(curNode.right, target);
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return bool布尔型
     */
    public boolean hasPathSum (TreeNode root, int sum) {
        // write code here
        if(root==null){
            return false;
        }
        return dfs(root,sum);
    }
    public boolean dfs (TreeNode root, int sum){
        if(root==null) return false;
        sum-=root.val;
        if(sum==0&&root.left==null&&root.right==null){
            return true;
        }
        return dfs(root.left,sum)||dfs(root.right,sum);
    }
}

深度优先遍历+回溯

思路和上面差不多,也是将 sum 减去当前节点的权重(root.val),当 sum 减到零时,说明目标路径存在,然后输出结果。只是需要用一个集合装起来。
代码如下:
这里说两个点。
 if(root==null) return res;
1.这里为什么返回res?
我们可能会觉得是返回null,但是本题的直接返回null是不行的。有个特例不能过。题目要求返回[],我们不能直接返回null。假设我们在走一条不符合题意的路线,就假设我们的最左边的路线不符合题意吧,我们按照代码的逻辑,一直往下走,我们会发现if中有个条件expectNumber==0,但是我们这条路径肯定不符合条件,所以if语句不会执行,所以我们知道res是空的,返回即可。而且这个语句是我们递归的终止条件。这里也可以用return newArrayList<ArrayList<Integer>>();
stack.pop();
2.这是什么用?
这里的作用就是回溯,假设我们在走一条不符合题意的路线,就假设我们的最左边的路线不符合题意吧,我们按照代码的逻辑,一直往下走,最后return res(此时res为空),然后我们需要回溯,就需要将stack中的元素pop出来,实现回溯的目的。
import java.util.*;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
    Stack<Integer> stack=new Stack<>();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber){
        if(root==null) return res;
        stack.push(root.val);
        expectNumber-=root.val;
        if(expectNumber==0&&root.left==null&&root.right==null){
            res.add(new ArrayList<Integer>(stack));
        }
        FindPath(root.left,expectNumber);
        FindPath(root.right,expectNumber);
        stack.pop();
        return res;
    }
}