题目描述
分析
题目的意思是找到根节点到叶节点的路径中的节点值之和等于目标值的路径,比较直接的方式是通过target和root来递归,每向下传递一级就把target减去当前节点的值,当监测到根节点且target为0时,就可以保存该路径。具体步骤见如下分解分析:
两个队列来保存结果,其中一个用来保存找到的结果路径,另一个用来保存临时累加的路径。这两个队列作为全局。
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> path = new ArrayList<>();
实现一个没有返回值的方法,它不需要返回值,因为有全局队列。
public void find(TreeNode root, int target){}
对target分析:
1、直接返回,剪枝
if (target < 0) {
return;
}
2、满足条件路径
if(root.val == target && root.left == null && root.right == null) {
res.add(new ArrayList<>(path));
}
3、递归查找
if (root.left != null) {
find(root.left, target - root.val);
}
if (root.right != null) {
find(root.right, target - root.val);
}
关键的步骤是在每个find递归的开始为path添加一个节点,在同参差递归结束后移除这个节点
path.add(root.val);
。。。。。。
path.remove(path.size() - 1);
完整代码
public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> path = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if (root == null) {
return res;
}
find(root, target);
return res;
}
public void find(TreeNode root, int target) {
if (target < 0) {
return;
}
path.add(root.val);
if(root.val == target && root.left == null && root.right == null) {
res.add(new ArrayList<>(path));
}
if (root.left != null) {
find(root.left, target - root.val);
}
if (root.right != null) {
find(root.right, target - root.val);
}
path.remove(path.size() - 1);
return;
}
}