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

京公网安备 11010502036488号