- 题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和targetSum 。
- 路径和概念:
每一条路径都是从根节点开始,直至叶子节点。这条路径上经过的所有节点值得累加和,即一条二叉树路径和。
- 思路:
总体思路:使用递归,遍历整棵树,直至叶子结点,并记录路径和。再与目标进行比较。 具体思路: 1、如果当前节点有左子树,将当前节点值加入到路径和中。并递归其左子树,计算路径和。 2、如果当前节点有右子树,将当前节点值加入到路径和中。并递归其右子树,计算路径和。 3、如果当前节点无左右子树,即当前节点为叶子节点。此时将当前节点加入到路径和中。得到一条二叉树路径和。 4、判断该二叉树路径和是否等于目标值,相等返回true,否则返回false。
- 注意:
1、当递归到叶子节点时,需要将叶子节点的值加入到当前路径和中。以为递归逻辑中,都是遍历其子树时才将当前节点加入到路径和中,到叶子节点时不会再向下递归,此时叶子节点值还未加入到路径和中。需要加入之后再与目标值比较。 2、不要设置中建变量记录路径和,防止计算右子树时,路径中重复累加左子树的值。 3、题目要求返回是否存在即可,那么整棵树中只要有就返回true。
- 代码(Java)
public static boolean hasPathSum(TreeNode root, int targetSum) { // 空树直接返回false if (root == null) { return false; } // 如果根节点左右子树都是空,直接比较根节点的值是否为targetSum if (root.left == null && root.right == null) { return root.val == targetSum; } // 递归判断 return hasPathSum(root, targetSum, 0); }
public static boolean hasPathSum(TreeNode root, int targetSum, int sum) { if (root.left == null && root.right == null) { // 当递归到叶子节点时,将叶子节点的值加上之前加和即一条路径的总和,在与targetSum比较 return (sum + root.val) == targetSum; } boolean left = false; boolean right = false; if (root.left != null) { // 将当前节点值加入路径总和中,并向其左子树递归 left = hasPathSum(root.left, targetSum, sum + root.val); } if (root.right != null) { // 将当前节点值加入路径总和中,并向其右子树递归 right = hasPathSum(root.right, targetSum, sum + root.val); } // 只要有一条路径和为targetSum即返回true return left || right; }
- 结果
2021/2/22 17:37 info 解答成功: 执行耗时:0 ms,击败了100.00% 的Java用户 内存消耗:38.6 MB,击败了13.36% 的Java用户
LeetCode第112题:路径总和
于 2021-02-22 18:11:24 首次发布