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