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 {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param targetSum int整型
     * @return bool布尔型
     */
    public boolean hasPathSumII (TreeNode root, int targetSum) {
        // write code here
            boolean[] res = {false};
            Set<Integer> set = new HashSet<>();
            set.add(0);

            dfs(root, targetSum, 0, res, set);

            return res[0];
        }

        /**
         * 深度优先搜索:遍历二叉树,判断是否存在路径和等于目标和
         *
         * @param root        当前节点
         * @param targetSum   目标和
         * @param sum         当前路径的节点值之和
         * @param res         结果数组,用于记录是否存在路径和等于目标和
         * @param set         集合,用于存储已经遍历过的路径和
         */
        private void dfs(TreeNode root, int targetSum, int sum, boolean[] res,
                         Set<Integer> set) {
            if (root == null || res[0]) {
                return;
            }

            sum += root.val;

            // 判断是否存在路径和等于目标和
            if (set.contains(sum - targetSum)) {
                res[0] = true;
                return;
            }

            // 当前路径和小于目标和时才继续遍历
            if (sum < targetSum) {
                set.add(sum);
                if (root.left != null) {
                    dfs(root.left, targetSum, sum, res, set);
                }
                if (root.right != null) {
                    dfs(root.right, targetSum, sum, res, set);
                }
                set.remove(sum);
            }
        }
    }

该Java代码使用Java编程语言。

该题考察的知识点是二叉树和深度优先搜索(DFS)。

代码的解释如下:

  1. 首先定义了一个TreeNode类来表示二叉树的节点。该类包含一个整型的值val,以及左子节点left和右子节点right
  2. Solution类中的hasPathSumII方法用于判断二叉树中是否存在一条路径的节点值之和等于目标和。
  3. dfs方法是私有的递归方法,用于进行深度优先搜索。它接收当前节点root、目标和targetSum、当前路径的节点值之和sum、结果数组res以及已经遍历过的路径和的集合set作为参数。
  4. dfs方法中,首先判断当前节点是否为空或者结果已经为true,如果是,则直接返回。
  5. 然后计算当前路径的节点值之和,即将当前节点的值加到sum上。
  6. 判断是否存在路径和等于目标和,即判断set中是否包含sum - targetSum。如果是,则将结果数组res置为true,并返回。
  7. 如果当前路径和sum小于目标和targetSum,则将sum添加到set中,然后递归调用dfs方法遍历左子节点和右子节点,并传入更新后的sum
  8. 在递归调用结束后,记得将sumset中移除,以便在回溯时不影响其他路径的计算结果。
  9. 最后,在hasPathSumII方法中,创建结果数组res和集合set,并初始化set中的值为0。
  10. 调用dfs方法进行深度优先搜索,将结果存储在res中。
  11. 返回结果数组res中的值,即表示二叉树中是否存在一条路径的节点值之和等于目标和。