Skip to content

力扣链接:112.路径总和

难度:⭐

✏️ 方法一:

解题关键词:二叉树递归

解题思路:使用递归一直往下判断是否存在叶子节点的值等于当前传入的 sum 值,如果有,那么就存在这样的叶子节点。

typescript
function hasPathSum(root: TreeNode | null, targetSum: number): boolean {
  // 如果节点为空,直接返回 false
  if (root === null) return false

  // 如果当前节点是叶子节点,那么判断当前节点的值是否等于 targetSum
  // 如果相等,说明存在这样一条路径
  if (!root.left && !root.right) {
    return targetSum == root.val
  }

  // 递归判断左子树
  const left = hasPathSum(root.left, targetSum - root.val)
  // 递归判断右子树
  const right = hasPathSum(root.right, targetSum - root.val)

  return left || right
};

✏️ 方法二:

解题关键词:二叉树层序遍历

解题思路:使用层序遍历往下走,用两个栈,一个栈保存节点,另一个栈保存对应位置节点的路径和,当到了叶子节点,当前节点的路径和已经等于 targetSum,那么就存在这样一条路径。

typescript
function hasPathSum(root: TreeNode | null, targetSum: number): boolean {
  // 如果 root 为空,直接返回 false
  if (root === null) return false

  // 节点队列
  const queue: TreeNode[] = [root]
  // 每一条路径和
  const pathsSum: number[] = [root.val]

  while (queue.length) {
    // 拿到当前要操作的节点
    const target = queue.shift()
    // 拿到从根节点到当前操作的节点的路径和
    const targetValue = pathsSum.shift()

    // 如果不是叶子节点,那么继续加和
    if (target.left || target.right) {
      if (target.left) {
        queue.push(target.left)
        pathsSum.push(targetValue + target.left.val)
      }
      if (target.right) {
        queue.push(target.right)
        pathsSum.push(targetValue + target.right.val)
      }
    } else if (targetValue === targetSum) { // 到了叶子节点,判断是否路径和等于 targetSum
      return true
    }
  }

  return false
};