Skip to content

力扣链接:129.求根节点到叶节点数字之和

难度:⭐⭐

✏️ 方法一:

解题关键词:二叉树递归

解题思路:使用深度优先遍历,然后记录一个 preSum,如果是叶子节点,那么直接将 preSum + 叶子节点的值返回,否则继续向下深度遍历。

typescript
function sumNumbers(root: TreeNode | null): number {
  // 深度优先遍历
  const dfs = (root: TreeNode | null, preSum: number): number => {
    // 如果节点为空,返回0
    if (root === null) return 0

    // 将当前节点的值 + 前面和*10
    const sum = preSum * 10 + root.val
    // 如果是叶子节点,直接返回和
    if (root.left === null && root.right === null) return sum

    // 不是叶子节点,一直向下递归
    return dfs(root.left, sum) + dfs(root.right, sum)
  }

  const sum = dfs(root, 0)

  return sum
};

✏️ 方法二:

解题关键词:二叉树

解题思路:使用两个栈,一个栈保存节点,另一个栈保存对应节点的数字,如果遇到叶子节点,那么将此时节点对应的数值加到 result 上,如果不是叶子节点,继续把左右孩子节点入栈,并且将左右孩子对应的数字也入栈。

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

  // 最后的结果
  let result = 0
  // 存放节点的队列
  const queue: TreeNode[] = [root]
  // 存放上面队列中每个节点对应的数字
  const pathSum: number[] = [root.val]

  while (queue.length) {
    // 每个节点出对
    const target = queue.shift()
    // 拿出当前节点对应的数字
    const sum = pathSum.shift()!

    // 如果是叶子节点,加到 result
    if (target.left === null && target.right === null) {
      result += sum
    }

    // 判断左节点是否存在,存在的话入队,并且将节点对应的数字入队
    if (target.left) {
      queue.push(target.left)
      pathSum.push(sum * 10 + target.left.val)
    }
    // 判断右节点是否存在,存在的话入队,并且将节点对应的数字入队
    if (target.right) {
      queue.push(target.right)
      pathSum.push(sum * 10 + target.right.val)
    }
  }

  return result
};