树 - 路径总和

时间:2015-10-17 23:33:55

标签: java data-structures tree

问题 - >给定二叉树和求和,确定树是否具有根到叶路径,以便沿路径累加所有值等于给定总和。

我的解决方案 - >

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);
        }

    }
}

输出 - &gt;

输入: [1,-2,-3,1,3,-2,空,-1] 3 输出:true 预期:错误

我真的不确定我在哪里出错了。我尝试使用int和Integer类型选项来获得结果,但它没有用。请帮忙。

1 个答案:

答案 0 :(得分:1)

我看到的问题是使用result变量,因为您将left节点的值添加到result并使用left子树完成后,您将添加right child对结果的值,这是错误的,因为它现在具有leftright子值的总和。

所以基本上你要添加之前result中所有节点的值 root遍历中的节点inorder

你可以试试这个:

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);
    }
}

编辑:1

解决此问题的另一种简单方法:您不需要创建包含所有根到叶路径之和的数组。您可以简单地继续递减所需的总和。

代码:

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));
    }
}