路径总和 III

83 阅读1分钟
/**
 * 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
 *
 * 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
 *
 * 参考链接: https://leetcode.cn/problems/path-sum-iii/?envType=study-plan-v2&envId=leetcode-75
 */
public class PathSum {

    /**
     * 题解:
     * 1.pathSum() 函数: 以当前函数的输入值作为起始节点; 每个节点的left和right均再次作为起始节点.
     * 2. rootSum()函数:主要判断当前节点是否可以作为终结点;如果不行,则继续往叶子节点遍历.
     * @param root
     * @param targetSum
     * @return
     */
    public int pathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return 0;
        }
        int ret = rootSum(root, Long.valueOf(targetSum));
        ret += pathSum(root.left, targetSum);
        ret += pathSum(root.right, targetSum);
        return ret;
    }

    public int rootSum(TreeNode root, Long targetSum) {
        int ret = 0;
        if (root == null) {
            return 0;
        }
        if (root.val == targetSum) {
            ret++;
        }
        ret += rootSum(root.left, Long.valueOf(targetSum - root.val));
        ret += rootSum(root.right, Long.valueOf(targetSum - root.val));
        return ret;
    }


    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
}