题目描述
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
For example:
Given the below binary tree andsum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
return true, as there exist a root-to-leaf path5->4->11->2which sum is 22.
妈呀,这道题我也是想用递归的,但是我是想再该方法外生成一个方法来递归,结果错了通不过,下面是代码如果大家知道哪里出问题,麻烦告诉一下小弟
public class HasPathSum {
boolean check =false;
public boolean hasPathSum(TreeNode root, int sum) {
int num = 0;
check(sum, root,num);
return check;
}
public void check(int sum,TreeNode root,int num) {
if(root==null)return;
else {
if(num>sum||(num+root.val)>sum)return;
num+=root.val;
check(sum, root.left,num);
check(sum, root.right,num);
if(root.left==null&&root.right==null) {
if(num==sum)
check = true;
return;
}
}
}
}
别人的代码很简洁,也通过了,关键是我自己做想不到要这么做:
public class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(root==null)return false;
if(root.left==null&&root.right==null) {
if(sum-root.val==0)return true;
else return false;
}
boolean left = hasPathSum(root.left, sum-root.val);
boolean right = hasPathSum(root.right, sum-root.val);
return left||right;
}
}
补充:
哈哈哈,小弟钻牛角尖了还非弄出来不可,就弄了个test类自己测试。终于发现问题在于,我他妈没有考虑元素是负数啊,于是将判断逻辑是正数的变成全部,就出来了,其实就是删了一句话:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
boolean check =false;
public boolean hasPathSum(TreeNode root, int sum) {
int num = 0;
check(sum, root,num);
return check;
}
public void check(int sum,TreeNode root,int num) {
if(root==null)return;
else {
num+=root.val;//把这句话前面的判断逻辑if(num>sum||(num+root.val)>sum)return;删了
if(root.left==null&&root.right==null) {
if(num==sum)
check = true;
return;
}
check(sum, root.left,num);
check(sum, root.right,num);
}
}
}
结果就通过了!!!!
每日心得:我觉得吧,其实你看别人的解答思路,是为你的编程逻辑提供了燃料,但是你自己编程的时候自己的那个逻辑是最重要的,自己弄清楚自己的逻辑可不可以走。如果是非常错误的,确实不可以走这个逻辑,好啦,知道问题所在然后放弃现在的逻辑,参考别人的逻辑并吸收变成自己的。但是虽然没通过,还是没有发现自己逻辑有问题又有时间,请务必找出问题,能够解决就解决逻辑出错的地方,继续改进,直到用自己的逻辑通过编程题。这真的对你自己码代码背诵正确答案要提高快的多。
最怕的习惯就是自己没通过题目,又迷迷糊糊不知道哪里有问题,不通过各种途径(不怕丑的问人,害羞的自己上网找)去找到正确逻辑然后发现自己错误的点的,就放弃了,直接去copy别人的代码然后去理解别人的步骤,似似非非的觉得哦,原来人家的逻辑是这样额,就照抄别人的答案,并且蒙蔽自己觉得自己解决了一题,心情大好,就去做别的事了。其实对自己的帮助并不大啊