做这道题目时,一开始觉得难度不大想好递归思路就可以了,但是一开始我在FindPath__(TreeNode root,int target,ArrayList<Integer> in_list)是这样传参的,但是由于in_list在递归时是传址,所以造成我in_list的内容一旦变化,之前add()到list的in_list变成最新的in_list。所以,在list内的每个in_list必须都是不一样的(都是新new的),我还要保存递归遍历二叉树时的节点,随每次递归保存一个节点,当我处理完以某个节点为根的子数时,此时路径中不应该再有这个节点,由于传址不能恢复上次递归时的参数状况,所以就要手动释放,在这里就是pop()。总之,有关二叉树的编程总是离不开最基础的三种递归遍历的思想,结合三种的某一种遍历方式想好递归结束条件和参数的传递就不是很难了。
package something;
import java.util.ArrayList;
import java.util.Stack;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public static void main(String[]args){
TreeNode root=new TreeNode(2);
root.left=new TreeNode(5);
root.right=new TreeNode(4);
root.right.right=new TreeNode(1);
Solution s=new Solution();
ArrayList<ArrayList<Integer>> list=new ArrayList<>();
list=s.FindPath(root, 7);
System.out.println(list.toString());
}
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> list=new ArrayList<>();
ArrayList<Integer>in_list=new ArrayList<>();
Stack<Integer>path=new Stack<>();
if(root==null) return list;
list=FindPath__(root,target,list,path);
return list;
}
public ArrayList<ArrayList<Integer>> FindPath__(TreeNode root,int target,ArrayList<ArrayList<Integer>> list,Stack<Integer>path) {
if(root==null) return list;
else{
if(root.left==null&&root.right==null&&target==root.val){
ArrayList<Integer>in_list=new ArrayList<>();
for (Integer integer : path) {
in_list.add(integer);
}
in_list.add(root.val);
list.add(in_list);
System.out.println(in_list);
}else{
path.push(root.val);
FindPath__(root.left, target-root.val,list,path);
FindPath__(root.right, target-root.val,list,path);
path.pop();
}
}
return list;
}
}