在利用 Recursive Algorithm 进行树遍历时,需要注意:
1、当要修改诸如List类变量时,不要影响到后面的递归调用。
例如: [LeetCode]Permutations
private void helper(List<Integer> preList,List<Integer> remains,List<List<Integer>> ans){
//bound
if(remains.size()==0){
List<Integer> list=new ArrayList<Integer>(preList);
ans.add(list);
return;
}
for(int i=0;i<remains.size();i++){
int n=remains.get(0);
remains.remove(0);
preList.add(n);
helper(preList,remains,ans);
preList.remove(preList.size()-1);//be careful
remains.add(n); //be careful
}
}
当递归返回到本级时preList、remains
已经发生改变,如果没有13-14行就会出错。
2、当对值进行修改时,不要影响到后面的递归调用。
例如:[LeetCode]Unique Paths的DFS方法中
private void helper(int x,int y,int m,int n){
//base case
if(x==m-1||y==n-1){
count++;
return;
}
if(x<m-1)
helper(x+1,y,m,n);//be careful
if(y<n-1)
helper(x,y+1,m,n);
}
9行helper(x+1,y,m,n);
别写成helper(++x,y,m,n);
,它会影响11行helper(x,y+1,m,n);
的x
值。