LeetCode第112题:路径总和

  1. 题目:
    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和targetSum 。
  2. 路径和概念:
    每一条路径都是从根节点开始,直至叶子节点。这条路径上经过的所有节点值得累加和,即一条二叉树路径和。
  3. 思路:
    总体思路:使用递归,遍历整棵树,直至叶子结点,并记录路径和。再与目标进行比较。
    具体思路:
        1、如果当前节点有左子树,将当前节点值加入到路径和中。并递归其左子树,计算路径和。
        2、如果当前节点有右子树,将当前节点值加入到路径和中。并递归其右子树,计算路径和。
        3、如果当前节点无左右子树,即当前节点为叶子节点。此时将当前节点加入到路径和中。得到一条二叉树路径和。
        4、判断该二叉树路径和是否等于目标值,相等返回true,否则返回false。
  4. 注意:
    1、当递归到叶子节点时,需要将叶子节点的值加入到当前路径和中。以为递归逻辑中,都是遍历其子树时才将当前节点加入到路径和中,到叶子节点时不会再向下递归,此时叶子节点值还未加入到路径和中。需要加入之后再与目标值比较。
    2、不要设置中建变量记录路径和,防止计算右子树时,路径中重复累加左子树的值。
    3、题目要求返回是否存在即可,那么整棵树中只要有就返回true。
  5. 代码(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;
        }
  6. 结果
          2021/2/22
          17:37	info
          解答成功:
          执行耗时:0 ms,击败了100.00% 的Java用户
          内存消耗:38.6 MB,击败了13.36% 的Java用户
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值