题目描述
第一次做法(递归+回溯)
思路,暴力法,前序遍历,每遍历一个节点,都求和。当添加到了叶子节点就求和,等于,则添加到一个list里面。不等于则放回。这个过程的难点就在于:如何实时维护一个记录当前遍历节点的路径和nums数组。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
ArrayList<Integer> nums = new ArrayList();
trave(root,list,sum,nums);
return list;
}
public void trave(TreeNode root,List<List<Integer>> list,int sum,ArrayList<Integer> nums){
if(root==null){
return ;
}
nums.add(root.val);
if(root.left==null&&root.right==null){//叶子节点
if(Sum(nums)==sum){//根节点到叶子节点路径总和等于给定目标和的路径。
ArrayList<Integer> nums1= new ArrayList<>();//直接对nums添加,导致remove会影响添加的list中的nums
for(Integer i:nums){
nums1.add(i);
}
list.add(nums1);
}
return;
}
trave(root.left,list,sum,nums);
if(nums.size()>1&&root.left!=null){
nums.remove(nums.size()-1);
}
trave(root.right,list,sum,nums);
if(nums.size()>1&&root.right!=null){//注意,当它的子节点为空,即null的时候,我们是不能够移除最后添加的元素的。比如层序:1,null,2,null,3,null,4,null,5//我们把这个值使用完之后还要把它给移除,这就是回溯
nums.remove(nums.size()-1);
}
}
public int Sum(ArrayList<Integer> nums){
int sum1=0;
for(Integer i:nums){
sum1+=i;
}
return sum1;
}
}
时间复杂度:O(n2),取决于遍历树的结点深度,最坏的情况下达到O(n2)
空间复杂度:O(N),建立的数组大小不超过树的结点数。