Java 树路径和

Java 树路径和,java,data-structures,tree,Java,Data Structures,Tree,问题->给定一棵二叉树和一个和,确定该树是否有根到叶的路径,以便沿路径的所有值相加等于给定的和 我的解决方案-> public class Solution { public boolean hasPathSum(TreeNode root, int sum) { if (root == null || sum == 0){ return false; } List<Integer> resultSet

问题->给定一棵二叉树和一个和,确定该树是否有根到叶的路径,以便沿路径的所有值相加等于给定的和

我的解决方案->

public class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null || sum == 0){
            return false;
        }
        List<Integer> resultSet = new ArrayList<Integer>();
        Integer result = root.val;
        inorder(root, result, resultSet);
        return resultSet.contains(sum);
    }
    public void inorder(TreeNode root, Integer result, List<Integer> resultSet){
        if (root.left == null && root.right == null){
            resultSet.add(result);
        }
        if (root.left != null) {
            result += Integer.valueOf(root.left.val);
            inorder(root.left, result, resultSet);
        }
        if (root.right != null) {
            result += Integer.valueOf(root.right.val);
            inorder(root.right, result, resultSet);
        }

    }
}
公共类解决方案{
公共布尔hasPathSum(树节点根,整数和){
if(root==null | | sum==0){
返回false;
}
List resultSet=new ArrayList();
整数结果=root.val;
顺序(根、结果、结果集);
返回结果集包含(总和);
}
public void inorder(树节点根、整数结果、列表结果集){
if(root.left==null&&root.right==null){
结果集。添加(结果);
}
if(root.left!=null){
结果+=整数.valueOf(root.left.val);
顺序(root.left、result、resultSet);
}
if(root.right!=null){
结果+=整数.valueOf(root.right.val);
顺序(root.right、result、resultSet);
}
}
}
输出->

输入: [1,-2,-3,1,3,-2,null,-1] 3. 输出:真 期望值:false


我真的不知道我在这方面哪里出了问题。我试着在结果中使用int和Integer类型选项,但不起作用。请帮助。

我看到的问题是
结果
变量,因为一旦您将
节点的值添加到
结果
中,并使用
子树完成后,u将向结果添加
右子节点的值,这是错误的,因为现在它具有
left
right
子值之和

因此,本质上,您是在添加前面出现的
结果中所有节点的值
按顺序遍历中的节点
root

你能试试这个吗

public void inorder(TreeNode root, Integer result, List<Integer> resultSet){
    if (root.left == null && root.right == null){
        resultSet.add(result);
    }
    if (root.left != null) {
        inorder(root.left, result+Integer.valueOf(root.left.val), resultSet);
    }
    if (root.right != null) {
        inorder(root.right, result+Integer.valueOf(root.right.val), resultSet);
    }
}

嘿,那没用。不,我不是在一个级别添加左节点值和子节点值。我将通过递归调用更深一层,然后只添加结果。输入:[7,0,null,-1,-6,null,1,null,null,-7]0输出:false预期为:true因此,本质上我只是在不同级别添加节点值,然后检查是否命中了叶节点。我使用类似的代码在树中查找不同的路径。所以我认为这个方法应该也适用于这个问题。但我在哪里出了问题。我发布了另一个解决这个问题的方法。看看这个。您还可以尝试打印出结果数组,看看它有哪些不同的路径。这将有助于用您当前的方法调试问题是的,谢谢!后来我尝试了一种类似的方法,效果很好。
public boolean hasPathSum(TreeNode root, int sum) {
    if (root == null) {
        return false;
    } else {
        return hasPathSumHelper(root, sum);
    }

}

boolean hasPathSumHelper(TreeNode root, int sum) {
    if (root.left == null && root.right == null) {//if leaf node
        if (Integer.valueOf(root.val) == sum) { //if node value is equal to sum
            return true;
        } else {
            return false;
        }
    }
    if ((root.left != null) && (root.right != null)) {
        return (hasPathSumHelper(root.left, sum - Integer.valueOf(root.val)) || hasPathSumHelper(root.right, sum - Integer.valueOf(root.val)));
    }
    if (root.left != null) {
        return hasPathSumHelper(root.left, sum - Integer.valueOf(root.val));
    } else {
        return hasPathSumHelper(root.right, sum - Integer.valueOf(root.val));
    }
}