时间限制:1秒 空间限制:32768K 热度指数:285715
题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
注意:数组长度大的数组靠前,需重新定义Collections中的sort规则。
很神奇的是在第一次没有排序竟然也通过了
import java.util.Collections;
import java.util.Stack;
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 {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null) return new ArrayList<>();
Stack<TreeNode> s= new Stack();
s.push(root);
ArrayList<ArrayList<Integer>> res= new ArrayList<>();
findPathCore(s, res, target-root.val);
Collections.sort(res, new Comparator<ArrayList<Integer>>(){
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2){
if(o1.size()> o2.size())
return -1;
return 1;
}
});
return res;
}
public void findPathCore(Stack<TreeNode> s, ArrayList<ArrayList<Integer>> res, int tar){
TreeNode root= s.peek();
if(tar==0 && root.left==null && root.right==null){
//存储该路径
ArrayList<Integer> tmp= new ArrayList<>();
for(TreeNode t: s){
tmp.add(t.val);
}
res.add(tmp);
}
if(root.left!=null){
s.push(root.left);
findPathCore(s, res, tar-root.left.val);
s.pop();
}
if(root.right!=null){
s.push(root.right);
findPathCore(s, res, tar-root.right.val);
s.pop();
}
}
}
还有一种定义排序方式是在想排序的对象所对应类中实现Comparable接口,并重写compareTo类。
compared的规则为返回值为负数,按当前if中条件排序。