今日心情:🥱🥱 麻了
题目描述:
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
解题代码:
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
public static void process(TreeNode x, List<Integer> path, int preSum, int sum, List<List<Integer>> ans){
//到达最后叶子节点处
if(x.left == null && x.right == null){
if(preSum + x.val == sum){
path.add(x.val); //添加当前节点;
ans.add(copy(path)); //添加到满足条件的总的大集合中
path.remove(path.size()-1);
}
return;
}
//还没有到叶子节点的时候(非叶子节点)
path.add(x.val);
preSum += x.val;
if(x.left != null){
process(x.left,path,preSum,sum,ans); //左节点递归调用
}
if(x.right != null){
process(x.right,path,preSum,sum,ans); // 右节点递归调用
}
path.remove(path.size()-1);
// 如果有递归返回的话,说明当前还不满足targetsum值,所以从路径path中删除当前节点的值,进入下一循环。
}
// 拷贝符合条件的path
public static List<Integer> copy(List<Integer> path){
List<Integer> ans = new ArrayList<>();
for(Integer num : path){
ans.add(num);
}
return ans;
}
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> ans = new ArrayList<>();
if(root == null){return ans;}
ArrayList<Integer> path = new ArrayList<>();
process(root,path,0,targetSum,ans);
return ans;
}
}
解题思路:(来自左神 👉 数据结构与算法视频 )
(1)和之前写的路径总和那道题很像,只不过这道题就是将所有满足目标sum的路径都找出来并且返回一个list集合(👉 路径求和解析)
(2)还是采用递归调用的思想进行解题
(3)首先判断树节点不为空的情况(为空不需要进行递归,直接返回空的List<List<Integer>>通过ArrayList<>()实现。
(4)递归方法 process 参数: 当前treenode 节点 x ,存储当前路径的(List) path, 之前所有节点的值的总和presum,需要达到的目标sum,以及存储所有满足sum条件的path的集合。
1. 首先判断叶子节点处的情况(结束当前递归调用判断)
x.left == null && x.right == null (叶子节点左右均无节点)
如果该节点是叶子节点,那么presum + x.val (之前所有节点值总和 + 当前节点值 )是否满足targetsum 的要求,如果是则说明存在这样的节点 path 满足这样的sum要求,此时path需要添加当前 x.val的值,然后将当前path的所有节点值集合拷贝到ans集合中去。
2. 对于非叶子节点的处理
添加当前节点值到当前path中
计算presum += x.val (计算presum 直到加到叶子节点为止)
如果当前节点存在左右节点,则进行递归调用,直到叶子节点的判断为止,最终返回。
x.left != null ; x.right != null
3. ⚠️注意: 需要移除path最后一个,恢复递归调用前的节点存储路径。
(5)在主函数中调用process方法,然后返回存储路径的ans。