📜  打印二叉树中的所有 k-sum 路径(1)

📅  最后修改于: 2023-12-03 15:10:01.463000             🧑  作者: Mango

打印二叉树中的所有 k-sum 路径

介绍

给定一棵二叉树和一个整数 k,需要找到所有从根节点到叶子节点的路径中,节点值之和为 k 的路径,并返回这些路径。

示例

输入:

     5
    / \
   4   8
  /   / \
 11  13  4
/  \    / \
7   2   5   1

目标和: 22

输出:

[
   [5,4,11,2],
   [5,8,4,5]
]
算法

使用 DFS 深度优先搜索算法遍历整个二叉树。从每个节点开始,递归搜索此节点到所有叶子节点的路径,检查路径的节点值之和是否等于目标和 k,如果是,则将该路径添加到结果列表中。

为了实现这个算法,我们将从根节点开始的路径作为一个列表进行跟踪,并在遇到叶子节点时检查路径的节点值之和是否等于目标和 k。

代码
class Solution:
    def pathSum(self, root: TreeNode, k: int) -> List[List[int]]:
        res = []
        def dfs(node, target, path):
            if not node: 
                return
            if not node.left and not node.right and target == node.val:
                res.append(path + [node.val])
                return
            dfs(node.left, target - node.val, path + [node.val])
            dfs(node.right, target - node.val, path + [node.val])
        
        dfs(root, k, [])
        return res
复杂度分析
  • 时间复杂度: O(N^2),其中 N 是节点的数量。在最坏情况下,每个节点都可能是从根节点开始的路径的一部分。对每个节点访问一次,路径长度最坏情况下为 N,因此时间复杂度为 O(N^2)。
  • 空间复杂度: O(N),其中 N 是节点的数量。空间复杂度中的主要空间占用来自于存储从根节点到当前节点路径的列表,在最坏情况下,路径显然具有和节点数量一样的长度,因此空间复杂度为 O(N)。