# 21-05-24-二叉树求根到叶子节点数字之和

# 题目地址

https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/

# 题目描述

给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。

例如,从根到叶子节点路径 1->2->3 代表数字 123。

计算从根到叶子节点生成的所有数字之和。

说明: 叶子节点是指没有子节点的节点。

示例 1:

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

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

# 前置知识

基本都跟二叉树的遍历有关

二叉树的遍历

# 思路1

模仿前序遍历迭代的写法,利用preSum作为key值保存迭代值

# 代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var sumNumbers = function(root) {
  let sum = 0;
  if (!root) return sum;
  const stack = [{
    cur: root,
    preSum: 0
  }];
  while (stack.length > 0) {
    let node = stack.pop();
    if (node.cur) {
      if (!node.cur.left && !node.cur.right) {
        sum += node.preSum * 10 + node.cur.val;
      } else {
        stack.push({
          cur: node.cur.right,
          preSum: node.preSum * 10 + node.cur.val
        });

        stack.push({
          cur: node.cur.left,
          preSum: node.preSum * 10 + node.cur.val
        });
      }
      
    }
  }
  return sum;
};

# 复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

# 思路2

模仿前序遍历DFS递归的写法,利用preSum作为递归传参

  • 迭代算值:参数上次计算的和 * 10 + root.val就是当前值。
  • 递归主逻辑:d左子树和右子树的总和。
  • 递归出口:节点是叶子节点即没有left和right指针的时候。

# 代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var sumNumbers = function (root) {
  return dfs(root, 0);
  function dfs(root, preSum) {
    if (!root) return 0;
    preSum = preSum * 10 + root.val;
    if (!root.left && !root.right) return preSum;
    return dfs(root.left, preSum) + dfs(root.right, preSum);
  }
};

# 复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
Last Updated: 7/8/2021, 2:12:40 AM