113. 路径总和 II

166 阅读1分钟

题目介绍

力扣113题:leetcode-cn.com/problems/pa…

image.png

image.png

分析

深度优先搜索

我们可以采用深度优先搜索的方式,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径。

代码如下:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        dfs(root, 0, sum);
        return res;
    }
    public void dfs(TreeNode root, int num, int sum){
        if(root == null) {
            return;
        }
        num += root.val;
        list.add(root.val);
        //找到符合条件的一条路径
        if(num == sum && root.left == null && root.right == null) {
            res.add(new ArrayList(list));
        }
        dfs(root.left, num, sum);
        dfs(root.right, num, sum);
        //相当于回溯
        list.remove(list.size() - 1);
    }
}

复杂度分析

  • 时间复杂度:O(N^2) :其中N是树的节点数。在最坏情况下,树的上半部分为链状,下半部分为完全二叉树,并且从根节点到每一个叶子节点的路径都符合题目要求。此时,路径的数目为 O(N),并且每一条路径的节点个数也为 O(N)因此要将这些路径全部添加进答案中,时间复杂度为 O(N^2)

  • 空间复杂度:O(N),其中 NN 是树的节点数。空间复杂度主要取决于栈空间的开销,栈中的元素个数不会超过树的节点数。