leetcode [113]Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
Return:
[ [5,4,11,2], [5,8,4,5] ]
题目大意:
找出从根节点到叶子节点路径上和为给定sum的路径。
解法:
先开始是用dfs做的,后来发现自己的dfs会将一个路径添加两次。因为在递归到叶子节点的左右都是为空的,这时就会在res数组中添加两次。
java:
class Solution {
private void dfs(List<List<Integer>>res,List<Integer>tmp,TreeNode node,int tmpSum){
if(node==null){
if(tmpSum==0) {
res.add(new ArrayList<>(tmp));
}
return;
}
if(tmpSum<0) return;
tmp.add(node.val);
dfs(res,tmp,node.left,tmpSum-node.val);
dfs(res,tmp,node.right,tmpSum-node.val);
tmp.remove(tmp.size()-1);
}
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>>res=new ArrayList<>();
List<Integer>tmp=new ArrayList<>();
dfs(res,tmp,root,sum);
return res;
}
}
改了之后递归结束的条件就是节点的左右子节点都为空,则当前节点就是叶子节点。
java:
class Solution {
private void dfs(List<List<Integer>>res,List<Integer>tmp,TreeNode node,int tmpSum){
if(node.left==null&&node.right==null){
if(tmpSum==0) {
res.add(new ArrayList<>(tmp));
}
return;
}
if(node.left!=null) {
tmp.add(node.left.val);
dfs(res, tmp, node.left, tmpSum - node.left.val);
tmp.remove(tmp.size() - 1);
}
if(node.right!=null) {
tmp.add(node.right.val);
dfs(res, tmp, node.right, tmpSum - node.right.val);
tmp.remove(tmp.size() - 1);
}
}
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>>res=new ArrayList<>();
if(root==null) return res;
List<Integer>tmp=new ArrayList<>();
tmp.add(root.val);
dfs(res,tmp,root,sum-root.val);
return res;
}
}
更加简化的代码如下:
class Solution {
private void dfs(TreeNode root, int sum, List<Integer>tmp, List<List<Integer>> res){
if (root == null) return;
tmp.add(root.val);
if (root.left == null && root.right==null && root.val==sum){
List<Integer> list=new ArrayList<>(tmp);
res.add(list);
//一定不要忘记这一句
tmp.remove(tmp.size()-1);
return;
}
dfs(root.left,sum-root.val,tmp,res);
dfs(root.right,sum-root.val,tmp,res);
tmp.remove(tmp.size()-1);
}
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res=new ArrayList<>();
List<Integer>tmp=new ArrayList<>();
dfs(root,sum,tmp,res);
return res;
}
}

浙公网安备 33010602011771号