📅  最后修改于: 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$ 个节点(底层节点)。