LeetCode 129. 求根到叶子节点数字之和 | Python

129. 求根到叶子节点数字之和


题目来源:力扣(LeetCode)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->2->3 代表数字 123

现在题目要求的就是所有这样生成的数字之和。

这里主要说一下,根到叶子节点的路径是如何生成一个数字?

还是以上面的例子说明:

1->2->3

要得到 123 这个数字,可以是:

1 * 100 + 2 * 10 + 3

再提取结合,可以是:

1 * 10 + 2 -> 12
12 * 10 + 3 -> 123

上面的式子当中,我们计算的 23123,这两个数字分别对应的是根节点到节点 2 以及根节点到节点 2 再到节点 3 的生成的数字。

也就是要计算根节点到当前节点生成的数字,要先知道根到父节点所生产的数字。

那么对于根节点而已,我们可以这样处理,假设根节点的父节点所产生的数字为 0,那么单独根节点生成的数字则为:

0 * 10 + 1 -> 1

我们可以发现,从根节点开始往下遍历的时候,可以边计算边遍历。

那么现在用深度优先搜索的方法进行实现,具体的做法如下:

  • 从根节点开始往下遍历,对遇到的节点进行处理:
    • 如果是叶子节点,那么将叶子节点的数进行计算;
    • 如果不是叶子节点,那么计算节点数后,再继续递归。

具体的代码实现如下。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sumNumbers(self, root: TreeNode) -> int:
        def dfs(root, pre_node_val):
            """
            Args:
                root: 节点
                pre_node_val:父节点生成的数字
            """
            if not root:
                return 0

            # 计算根到当前节点生成的数
            # 根到父节点生成的数 * 10 + 当前节点的值
            total = pre_node_val * 10 + root.val

            # 如果当前节点是叶子节点,将计算后的值返回
            if not root.left and not root.right:
                return total
            # 否则继续递归
            else:
                return dfs(root.left, total) + dfs(root.right, total)
        
        # 默认根节点的父节点生成的数字为 0
        pre_node_val = 0
        return dfs(root, pre_node_val)

欢迎关注


公众号 【书所集录


如有错误,烦请指出,欢迎指点交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值