力扣113. 路径总和 II(Java,DFS解法)

Problem: 113. 路径总和 II

题目描述

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

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

在这里插入图片描述
在这里插入图片描述

思路

题目要求找出所有从根节点到叶子节点的路径总和,这一点很容易让我们联想到使用DFS来求解本题。

先序遍历的顺序递归遍历二叉树,当遍历到二叉树的叶子节点时判断当前路径所有元素和是否等于题目所给的targetSum。

解题方法

1.定义成员变量List<List> result用于记录并返回最终的二维结果数组
2.编写深度优先函数,找出所有的符合条件的路径。

2.1.每次先将当前节点添加到当前的路劲当中,并判断当前节点是否为叶子节点;若为叶子节点再判断当前的路径上所有节点值之和是否等于给定的targetSum,若等于则将当前路径添加到最终的结果集合result,若当前节点为叶子节点但路径上所有节点值之和不等于targetSum则将当前用于记录路径的数组的最后一位去掉。
2.2.递归当前节点的左子树和右子树,在归的过程中由于要回溯到上一层节点,所以也要将当前用于记录路径的数组的最后一位去掉!!!

复杂度

时间复杂度:

O ( n 2 ) O(n^2) O(n2)

空间复杂度:

O ( n ) O(n) O(n)

代码实现细节处

1.若当前节点为叶子节点但路径上所有节点值之和不等于targetSum则将当前用于记录路径的数组的最后一位去掉;

image.png
image.png

2.在归的过程中由于要回溯到上一层节点,所以也要将当前用于记录路径的数组的最后一位去掉!!!

image.png
image.png

Code

/**
 * 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 List<List<Integer>> result;

    /**
     * @param root      树的根节点
     * @param targetSum 目标值
     * @return List<List < Integer>>
     */
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        depthFirstSearch(root, targetSum, new ArrayList<>(), 0);
        return result;
    }

   /**
     * 深度优先函数,找出所有的符合条件的路径
     *
     * @param root    树的根节点
     * @param sum     给定的targetSum
     * @param path    用于记录一路径的数组
     * @param pathSum 当前路径上的所有元素值之和
     */
    private void depthFirstSearch(TreeNode root, int sum, List<Integer> path, int pathSum) {
        //先将当前节点值添加到路径集合
        path.add(root.val);
        //已经递归到根节点
        if (root.left == null && root.right == null) {
            //当前路径值等于所给目标值
            if (pathSum + root.val == sum) {
                List<Integer> foundPath = new ArrayList<>();
                foundPath.addAll(path);
                result.add(foundPath);
            }
            //路径已经最大,需处理
            path.remove(path.size() - 1);
            return;
        }
        if (root.left != null) {
            depthFirstSearch(root.left, sum, path, pathSum + root.val);
        }
        if (root.right != null) {
            depthFirstSearch(root.right, sum, path, pathSum + root.val);
        }
        //回退过程中需要再次处理路径
        path.remove(path.size() - 1);
    }
}
  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值