📜  门| Gate IT 2008 |问题7(1)

📅  最后修改于: 2023-12-03 14:58:23.985000             🧑  作者: Mango

门 Gate IT 2008 - 问题7

题目描述

有一棵二叉树,每个节点的值为正整数。现在给定一个正整数K,请编写一个函数判断是否存在一条从根节点开始往下走的路径,使得路径上的节点权值之和恰好等于K。

输入
  • 一棵二叉树,该二叉树的每个节点包含一个正整数。
  • 一个正整数K,表示要求的路径权值之和。
输出
  • 如果存在一条从根节点开始往下走的路径,使得路径上的节点权值之和恰好等于K,则返回 true。
  • 否则,返回 false。
示例

如下所示的二叉树,K为22。

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

在这种情况下,存在一条从根节点开始往下走的路径(5->4->11->2),使得路径上的节点权值之和恰好等于22。因此,函数应该返回 true。

思路

这是典型的深度优先搜索(DFS)问题。我们只需要从根节点开始,递归地计算所有从该节点出发的路径权值之和,并判断是否可以得到所需的权值。

例如,在上面的例子中,我们可以先检查根节点是否等于所需权值。如果不是,我们就递归地计算其左子树和右子树,看是否有一条路径权值之和等于所需权值 K。

代码实现
def has_path_sum(root, sum):
    """
    :type root: TreeNode
    :type sum: int
    :rtype: bool
    """
    if not root:
        return False
    if not root.left and not root.right:
        return sum == root.val
    return has_path_sum(root.left, sum - root.val) or has_path_sum(root.right, sum - root.val)
复杂度分析
  • 时间复杂度:$O(n)$,其中 n 是二叉树中的节点数。最坏情况下,我们需要遍历树中的所有节点。
  • 空间复杂度:$O(h)$,其中 h 是二叉树的高度。在最坏的情况下,二叉树形成了链状结构,此时空间复杂度为 $O(n)$。在最好的情况下,二叉树是平衡的,此时空间复杂度为 $O(log n)$。