📜  最短根到叶路径和等于给定数(1)

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

最短根到叶路径和等于给定数

在二叉树中寻找一条从根节点到叶节点的路径,使得路径上所有节点的和等于给定的数。本题解将介绍解决这个问题的常用方法。

解法
深度优先搜索

我们使用深度优先搜索来遍历二叉树,同时记录当前节点到根节点的路径上的节点值之和。如果当前节点是一个叶节点,我们判断该节点值和当前路径值之和是否等于给定数。如果相等,我们就找到了一条符合条件的路径。

class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        if not root:
            return False
        
        def dfs(node: TreeNode, path_sum: int) -> bool:
            if not node.left and not node.right:
                return path_sum + node.val == targetSum
                
            if node.left and dfs(node.left, path_sum + node.val):
                return True
            if node.right and dfs(node.right, path_sum + node.val):
                return True
                
            return False
        
        return dfs(root, 0)

时间复杂度:$O(n)$,其中 $n$ 是二叉树中的节点总数。最坏情况下,当树呈现链状结构时,搜索需要遍历所有节点。

空间复杂度:$O(h)$,其中 $h$ 是二叉树的高度。最坏情况下,当树呈现链状结构时,空间复杂度为 $O(n)$。

广度优先搜索

我们也可以使用广度优先搜索来遍历二叉树,同时记录当前节点到根节点的路径上的节点值之和。如果当前节点是一个叶节点,我们判断该节点值和当前路径值之和是否等于给定数。如果相等,我们就找到了一条符合条件的路径。

class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        if not root:
            return False
        
        queue = [(root, root.val)]
        while queue:
            node, path_sum = queue.pop(0)
            if not node.left and not node.right:
                if path_sum == targetSum:
                    return True
                
            if node.left:
                queue.append((node.left, path_sum + node.left.val))
            if node.right:
                queue.append((node.right, path_sum + node.right.val))
                
        return False

时间复杂度:$O(n)$,其中 $n$ 是二叉树中的节点总数。最坏情况下,当树呈现链状结构时,搜索需要遍历所有节点。

空间复杂度:$O(n)$,因为队列中最多会存储 $n/2$ 个节点(底层节点)。