JZ84 二叉树中和为某一值的路径(三)

题目

给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。
1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点
2.总节点数目为n
3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)

方法 非递归层次遍历

思路

算法实现

既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊,但是我们不知道起点究竟在哪里,
而且任意节点都有可能是起点,那我们就前序遍历二叉树的所有节点,每个节点都可以作为一次起点,即子树的根节点。
具体做法:
    step 1:每次将原树中遇到的节点作为子树的根节点送入dfs函数中查找有无路径,如果该节点为空则返回。
    step 2:然后递归遍历这棵树每个节点,每个节点都需要这样操作。
    step 3:在dfs函数中,也是往下递归,遇到一个节点就将sum减去节点值再往下。
    step 4:剩余的sum等于当前节点值则找到一种情况。

代码

package mid.JZ84二叉树中和为某一值的路径3;

import java.util.*;

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param root TreeNode类
     * @param sum  int整型
     * @return int整型
     */
    private int res = 0;
    public int FindPath(TreeNode root, int sum) {
        // write code here
        if (root == null) return res;

        //查询以某结点为根的路径数
        dfs(root, sum);

        //以其子结点为新根
        FindPath(root.left, sum);
        FindPath(root.right, sum);
        return res;
    }
    public void dfs (TreeNode root, int sum) {
        if (root == null) return;
        //符合目标。res++
        if (sum == root.val)  res++;

        //子节点继续查找
        dfs(root.left, sum - root.val);
        dfs(root.right, sum - root.val);
    }
}