LeetCode CodeTop 113.路径总和Ⅱ

思路:在递归的同时,额外维护从根到当前节点的元素和sum。此外,还要在递归函数的外部维护一个path列表,记录从根到当前节点路径上的所有节点。

一、递归逻辑:

1.如果当前的节点是空节点,则直接返回。

2.把当前的节点加入path,同时sum减去当前节点的值(sum初始为targetSum)。

3.如果当前的节点是叶子节点且sum == 0,那么就把路径path加入答案。

4.否则,继续递归左右子树。

5.在递归返回之前,把我们在递归开头加入的节点,也就是当前path的最后一个节点,从path中去掉(恢复现场)。为什么要这样呢,这是因为当我们递归完左子树,要递归右子树之前,path中还保留着左子树的节点。如果不及时去掉的话,会导致最终加到答案中的path,既包含左子树的节点,又包含右子树的节点,这连"路径"都算不上。

二、复杂度分析:

1.时间复杂度:O(n^2),其中n是二叉树的节点个数。首先遍历所有节点的时间复杂度是O(n),因为每个节点恰好被访问一次。对于"一条链 + 完全二叉树"这样的"扫帚型"二叉树,我们会在O(n)个叶子节点处,都去复制长为O(n)的path(res.add(new ArrayList<>(path))),所以总的时间复杂度为O(n^2)。

2.空间复杂度:O(n),返回值不计入。

附代码:

java 复制代码
class Solution {
    private List<Integer> path = new ArrayList<>();
    private List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        dfs(root, targetSum);
        return res;
    }

    private void dfs(TreeNode root, int sum) {
        if (root == null) {
            return;
        }
        path.add(root.val);
        sum -= root.val;
        if (root.left == null && root.right == null && sum == 0) {
            res.add(new ArrayList<>(path));
        } else {
            dfs(root.left, sum);
            dfs(root.right, sum);
        }
        path.remove(path.size() - 1);
    }
}
相关推荐
ZC跨境爬虫2 小时前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
.道阻且长.2 小时前
10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数
算法·leetcode·职场和发展
学习中.........3 小时前
Karpathy nanoGPT 教程到底讲了什么
人工智能·算法·语言模型
城管不管3 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
地平线开发者4 小时前
征程6|YOLOv5x 在 Horizon 征程6 上的端到端部署实践(下)
算法·自动驾驶
speop5 小时前
llm-algo-leetcode |Task01
算法·leetcode·职场和发展
艾为电子5 小时前
【应用方案】电视沉浸式音频升级: 电视音频 awinic“芯片 + 算法” 一体化解决方案
算法·音视频
大熊背5 小时前
树莓派相机自动白平衡详解(二)
算法·白平衡·isppipeline
Scabbards_5 小时前
面试Leetcode - 算法合集
算法·leetcode·面试
chuan.bai5 小时前
Java RAG 实战附录:qwen3 与 bge-m3 模型切换指南
java·人工智能·算法