给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

 

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

 

提示:

  • 树中节点总数在范围 [0, 5000]
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

注意:本题与主站 113 题相同:https://leetcode-cn.com/problems/path-sum-ii/

Related Topics
  • 深度优先搜索
  • 回溯
  • 二叉树

  • 👍 307
  • 👎 0
  • 回溯DFS

    深度优先搜索回溯的一般应用题。
    相对的有一个比较类似但又不一样的题目可以结合起来一起学习理解【图解说明】DFS回溯+前缀和

    不同的是在437. 路径总和 III是求的路径上的区间合,需要借助前缀和的概念来处理。

    本题分析
    从根节点开始,往下DFS遍历,并记录路基上的节点合 和 节点的List集合
    当是根节点的时候,判断路径合是不是等于目标值,如果是把节点List集合塞进返回结果集里
    在退出当前节点遍历的时候,需要清除List集合中当前节点的值
    代码

    class Solution {
    
        List<List<Integer>> res = new ArrayList<>();
        int target;
        public List<List<Integer>> pathSum(TreeNode root, int target) {
            if (null == root){
                return new ArrayList<>();
            }
            this.target = target;
            dfs(root,0,new ArrayList<>());
            return res;
        }
    
    
        public void dfs(TreeNode node, int sum, List<Integer> list){
            if (node==null){
                return;
            }
            list.add(node.val);
            if (node.left == null && node.right == null){
                if (sum + node.val == target){
                    res.add(new ArrayList<>(list));
                }
                list.remove(list.size()-1);
                return;
            }
            dfs(node.left, sum + node.val,list);
            dfs(node.right,sum + node.val,list);
            list.remove(list.size()-1);
        }
    }