尝试一
result:case通过率为0.00%
code:
import java.util.ArrayList;
import java.util.Comparator;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//用来存路径
private ArrayList<ArrayList<Integer>> paths=new ArrayList<>();
//目标值
private int t=-1;
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//重置路径
paths=new ArrayList<>();
t=target;
path(root,0,new ArrayList<Integer>());
/*对路径进行排序*/
paths.sort(new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
if(o1.size()>o2.size()){
return -1;
}
else if(o1.size()<o2.size()){
return 1;
}
return 0;
}
});
return paths;
}
private void path(TreeNode node,int sum,ArrayList<Integer> path){
/*递归结束条件1*/
if(node==null){
/*比较大小*/
if(sum ==t){
paths.add(path);
}
return ;
}
/*递归结束条件2。当值已经大于指定值时,就不递归了*/
if(sum >= t){
return ;
}
sum+=node.val;
path.add(node.val);
path(node.left,sum,(ArrayList<Integer>)path.clone());
path(node.right,sum,(ArrayList<Integer>)path.clone());
}
}
测试用例:
不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%
用例:
{10,5,12,4,7},22
对应输出应该为:
[[10,5,7],[10,12]]
你的输出为:
[[10,5,7],[10,5,7],[10,12],[10,12]]
分析:当程序到达
sum+=node.val;
path.add(node.val);
path(node.left,sum,(ArrayList<Integer>)path.clone());
path(node.right,sum,(ArrayList<Integer>)path.clone());
时,如果sum已经为22了。那么向左边那个节点走,要加入paths一次;向右边那个子节点走,又要加入一次。所以就加入了两次
尝试2
根据尝试1,我们将递归结束标识提前。不让节点遍历到为null的时候。
result:答案正确:恭喜!您提交的程序通过了所有的测试用例
code:
import java.util.ArrayList;
import java.util.Comparator;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//用来存路径
private ArrayList<ArrayList<Integer>> paths=new ArrayList<>();
//目标值
private int t=-1;
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//重置路径
paths=new ArrayList<>();
t=target;
path(root,0,new ArrayList<Integer>());
/*对路径进行排序*/
paths.sort(new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
if(o1.size()>o2.size()){
return -1;
}
else if(o1.size()<o2.size()){
return 1;
}
return 0;
}
});
return paths;
}
private void path(TreeNode node,int sum,ArrayList<Integer> path){
if(node ==null){
return ;
}
sum+=node.val;
path.add(node.val);
/*递归结束条件1*/
if(node.left == null && node.right==null){
/*比较大小*/
if(sum ==t){
paths.add(path);
}
return ;
}
/*递归结束条件2。当值已经大于指定值时,就不递归了*/
if(sum >= t){
return ;
}
path(node.left,sum,(ArrayList<Integer>)path.clone());
path(node.right,sum,(ArrayList<Integer>)path.clone());
}
}
结论
- ArrayList的clone方法返回的是一个Object,但是我们可以把它强制类型转换为一个ArrayList
- ArrayList对象提供了一个sort方法,需要实现一个匿名类
Compartor
(和Comparble相似)。