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
中的值,即表示二叉树中是否存在一条路径的节点值之和等于目标和。