leetcode 112. 路径总和

题目

leetcode 112. 路径总和_第1张图片

思路

定义了一个全局变量 hasSum,在函数内部直接操作这个变量。

如果发现当前节点是叶子节点,并且求和等于目标和的话,让 hasSum=true。

如果不是叶子结点,则递归计算其左右节点。

看到一个评论区的简洁解法,比我的好多了,作差的这个思路比较妙。
class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return false;
        }
        if (root.left == null && root.right == null) {
            return sum - root.val == 0;
        }
        return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
    }
}

题解

注意:因为有负数的存在,不能通过判断正负号剪枝,这里被坑了一下。

// Definition for a binary tree node.
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

class Solution {
    boolean hasSum = false;

    public boolean hasPathSum(TreeNode root, int sum) {
        if (root != null) {
            getSum(root, 0, sum);
            return hasSum;
        } else return false;
    }

    public void getSum(TreeNode node, int sum, int target) {
        if (node != null) {//是节点
            sum += node.val;
            if (node.left != null || node.right != null) {//非叶子结点,递归计算左右孩子\
                getSum(node.left, sum, target);
                getSum(node.right, sum, target);
            } else {//是叶子节点,判断是否等于sum
                System.out.println(sum);
                if (sum == target) hasSum = true;
            }
        }
    }
}

有几次运行时间较长的通过,是因为调用了 sout 输出,注释掉就好了

leetcode 112. 路径总和_第2张图片

你可能感兴趣的:(leetcode)