每日一练:LeeCode-113、路径总和 II【二叉树+DFS+回溯+是否有返回值】

本文是力扣LeeCode-113、路径总和 II【二叉树+DFS+回溯+是否有返回值】 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。

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

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

示例 1:
每日一练:LeeCode-113、路径总和 II【二叉树+DFS+回溯+是否有返回值】_第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:
每日一练:LeeCode-113、路径总和 II【二叉树+DFS+回溯+是否有返回值】_第2张图片

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

示例 3:

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

提示:

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

思路

要遍历整个树,找到所有路径,所以递归函数不要返回值
每日一练:LeeCode-113、路径总和 II【二叉树+DFS+回溯+是否有返回值】_第3张图片
怎么判断递归是否需要返回值?大家可以参考我的博客每日一练:LeeCode-112、路径总和【二叉树+DFS+回溯】,这道题的解法思路和LeeCode-112是一致的,都是BFS+回溯

完整代码

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> pathList = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        if (root==null)return res;
        pathList.add(root.val);
        BFSPath(root,targetSum-root.val);
        return res;
    }
	// 递归函数不需要返回值,因为我们要遍历整个树
    void BFSPath(TreeNode cur,int targetSum){
    	// 遇到了叶⼦节点且找到了和为sum的路径
        if (cur.left==null&&cur.right==null&&targetSum==0){
        	//这一步细节,将一个路径列表(pathList)转换为一个ArrayList对象,否则结果都是[[],......]
            res.add(new ArrayList<>(pathList));	
            return;
        }
        if (cur.left!=null){	 // 左 (空节点不遍历)
            pathList.add(cur.left.val);
            BFSPath(cur.left,targetSum-cur.left.val);	// 递归
            pathList.remove(pathList.size()-1);		// 回溯
        }

        if (cur.right!=null){	 // 右 (空节点不遍历)
            pathList.add(cur.right.val);
            BFSPath(cur.right,targetSum-cur.right.val);	// 递归
            pathList.remove(pathList.size()-1);		// 回溯
        }
    }
}

注:最好还是不要精简回溯的过程,把回溯的痕迹写出来,方便写出来

最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序
大佬们有更好的方法,请不吝赐教,谢谢

你可能感兴趣的:(#,每日一道LeeCode算法题,算法,数据结构,leetcode)