算法:
用累减,每遍历一个节点就用target减去其值,减到叶子节点的时候,再判断叶子结点处累减的结果是否为0,若是,说明刚刚的路径有效。
调试过程:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null) return false;
targetSum -= root.val;
if (root.left == null && root.right == null) targetSum = 0;
if (root.left != null){
boolean left = hasPathSum (root.left, targetSum);
//告诉上一层,其左边是否有可用路径
return left;
}
if (root.right != null){
boolean right = hasPathSum (root.right, targetSum);
//告诉上一层,其左边是否有可用路径
return right;
}
}
}
原因:在这段代码中,确实存在一个问题。在Java中,当一个方法声明非void返回类型时(比如boolean),它必须确保在所有条件下都有返回值。在这个特定的情况下,当`root.left`和`root.right`都为null时,没有明确的返回值。
正确代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null) return false;
targetSum -= root.val;
if (root.left == null && root.right == null) {
//检查此时的 `targetSum` 是否为 0,如果是,则返回 `true`,表示找到了一条符合条件的路径;否则返回 `false`。
return targetSum == 0;
}
if (root.left != null){
boolean left = hasPathSum (root.left, targetSum);
//告诉上一层,其左边是否有可用路径
if (left) return true;
}
if (root.right != null){
boolean right = hasPathSum (root.right, targetSum);
//告诉上一层,其左边是否有可用路径
if (right) return true;
}
//最后的 `return false` 是处理了当 `root` 的左右子树都不为空,且都没有找到符合条件的路径时的情况。
return false;
}
}
注意:true和false都是小写!
时间空间复杂度:
时间复杂度分析
- 在最坏的情况下,即树是一个完全不平衡的树,时间复杂度为O(N),其中 N是树中节点的数量。
- 这是因为在最坏情况下,我们需要遍历树的所有节点才能确定是否存在一条路径的和为 `
targetSum
`。
空间复杂度分析
- 空间复杂度是由递归调用的栈空间所决定的。
- 在最坏的情况下,即树是一个链状结构,空间复杂度为O(N)。
- 这是因为在最坏情况下,递归调用会一直向下到达叶子节点之前不会停止。
因此,给定代码的时间复杂度为O(N),空间复杂度为O(N)。