1 题目
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/path-sum-iii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 Java
2.1 方法一(回溯,非模板;这个不好)
class Solution {
public int pathSum(TreeNode root
, int sum
) {
helper(root
, sum
);
return res
;
}
List
<Integer> list
= new ArrayList<>();
int res
= 0;
public void helper(TreeNode root
, int sum
) {
if(root
== null
) return;
int tmp
= 0;
list
.add(root
.val
);
for(int i
= list
.size() - 1; i
>= 0; i
--){
tmp
+= list
.get(i
);
if(tmp
== sum
) res
++;
}
helper(root
.left
, sum
);
helper(root
.right
, sum
);
list
.remove(list
.size() - 1);
}
}
2.2 方法二(回溯,模板)
class Solution {
public int pathSum(TreeNode root
, int sum
) {
if(root
== null
) return 0;
list
.add(root
.val
);
helper(root
, sum
);
return res
;
}
List
<Integer> list
= new ArrayList<>();
int res
= 0;
public void helper(TreeNode root
, int sum
) {
int tmp
= 0;
for(int i
= list
.size() - 1; i
>= 0; i
--){
tmp
+= list
.get(i
);
if(tmp
== sum
) res
++;
}
if(root
.left
!= null
){
list
.add(root
.left
.val
);
helper(root
.left
, sum
);
list
.remove(list
.size() - 1);
}
if(root
.right
!= null
){
list
.add(root
.right
.val
);
helper(root
.right
, sum
);
list
.remove(list
.size() - 1);
}
}
}
3 二刷
3.1 方法一(回溯递归,本层操作本层做)
class Solution {
public int pathSum(TreeNode root
, int sum
) {
helper(root
, sum
);
return res
;
}
int res
= 0;
List
<Integer> list
= new ArrayList<>();
public void helper(TreeNode root
, int sum
) {
if(root
== null
) return;
list
.add(root
.val
);
int tmpSum
= 0;
for(int i
= list
.size() - 1; i
>= 0; i
--){
tmpSum
+= list
.get(i
);
if(tmpSum
== sum
) res
++;
}
helper(root
.left
, sum
);
helper(root
.right
, sum
);
list
.remove(list
.size() - 1);
}
}