LeetCode热题(JS版) - 129. 求根节点到叶节点数字之和

86 阅读2分钟

题目

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

  示例 1:

image.png

输入:root = \[1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25

示例 2:

image.png

输入:root = \[4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026

思路

本题可以采用深度优先搜索(DFS)来实现。具体思路是遍历整棵树,在遍历时维护当前路径上的数字串,当遍历到叶子节点时,将当前路径所代表的数字添加到结果集中。

代码如下:

function sumNumbers(root: TreeNode | null): number {
  let res: number = 0
  if (!root) return res

  const traversal = (node: TreeNode | null, path: string) => {
    if (!node) return
    path += node.val.toString()
    if (!node.left && !node.right) {
      res += parseInt(path)
    } else {
      traversal(node.left, path)
      traversal(node.right, path)
    }
  }

  traversal(root, '')

  return res
}

image.png

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树中的节点数。在最坏情况下,需要遍历二叉树中的所有路径,因此时间复杂度为 O(n)。

  • 空间复杂度:O(n),空间复杂度取决于递归的深度,而树最坏情况下为链状,因此空间复杂度为 O(n)。