📌  相关文章
📜  查找二叉树的所有根到叶路径总和(1)

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

查找二叉树的所有根到叶路径总和

在二叉树中,从根节点到叶子节点的所有路径都被称为“根到叶路径”。本题要求查找给定二叉树的所有根到叶路径,并计算它们的路径总和。

解题思路

我们可以采用深度优先搜索(DFS)的思想来解决此问题。从根节点开始,递归遍历二叉树的每个节点,并将它们的值添加到路径总和中。当我们到达叶子节点时,将路径总和添加到结果列表中。

具体来说,我们可以定义一个递归函数 dfs(node, path_sum, res),其中 node 表示当前节点,path_sum 表示当前路径的总和,res 表示结果列表。在函数中,我们首先将当前节点的值添加到路径总和中,并判断当前节点是否是叶子节点。如果是叶子节点,则将路径总和添加到结果列表中,否则递归遍历当前节点的左右子树。遍历完当前节点的左右子树后,要将路径总和减去当前节点的值(即回溯到上一层递归)。

具体的实现细节请见代码片段。

代码实现
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """
        def dfs(node, path_sum, res):
            if node is None:
                return
            path_sum += node.val
            if node.left is None and node.right is None:
                res.append(path_sum)
            dfs(node.left, path_sum, res)
            dfs(node.right, path_sum, res)
            path_sum -= node.val
        
        res = []
        dfs(root, 0, res)
        return res
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是二叉树中节点的个数。最坏情况下,我们需要遍历每个节点一次。
  • 空间复杂度:$O(h)$,其中 $h$ 是二叉树的高度。在最坏情况下,二叉树的高度等于节点个数,此时递归调用栈的深度最大,为 $h$。