这里要注意空间复杂度,回溯的时候要从路径集合中去掉最后加入的点。值得细品。
我的代码效率不是很高
https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-68dg/
主要在temp列表进行赋值的时候,好的方法是用回溯,我这个是每一次都开辟两个空间,
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
node1.left = node2;
//node1.right = node3;
List<List<Integer>> res ;
res = pathSum(node1,4);
System.out.println(res.size());
}
public static List<List<Integer>> pathSum(TreeNode root, int target) {
if(root == null ) new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
process(root, target, 0, new ArrayList<>(), res);
return res;
}
public static void process(TreeNode root, int target, int cur, List<Integer> list, List<List<Integer>> lists ){
if(root == null )return;
if(root.left == null && root.right==null ) {
if(cur + root.val == target){
list.add(root.val);
lists.add(list);
}
return ;
}
List<Integer> temp = new ArrayList<>();
temp.addAll(list);
temp.add(root.val);
process(root.left, target, cur + root.val, temp , lists);
List<Integer> temp2 = new ArrayList<>();
temp2.addAll(list);
temp2.add(root.val);
process(root.right, target, cur + root.val, temp2 , lists);
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
看官方题解:
解法2: 广度优先,也要额外维护一个和队列,跟路径一一对应。
通过深入理解回溯思想,改进代码
public static void process(TreeNode root, int target, int cur, List<Integer> list, List<List<Integer>> lists ){
if(root == null )return;
if(root.left == null && root.right==null ) {
if(cur + root.val == target){
List<Integer> temp = new ArrayList<>();
temp.addAll(list);
temp.add(root.val);
lists.add(temp);
}
return ;
}
list.add(root.val);
process(root.left, target, cur + root.val, list , lists);
process(root.right, target, cur + root.val, list , lists);
list.remove(list.size()-1);
}
时间从超过2.5%的用户提高到超过100%的用户。