求根节点到叶节点数字之和

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

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0  9 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

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

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

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

示例 1

输入:root = [1,2,3]

输出:25

解释:

从根到叶子节点路径 1->2 代表数字 12

从根到叶子节点路径 1->3 代表数字 13

因此,数字总和 = 12 + 13 = 25

示例 2

输入:root = [4,9,0,5,1]

输出:1026

解释:

从根到叶子节点路径 4->9->5 代表数字 495

从根到叶子节点路径 4->9->1 代表数字 491

从根到叶子节点路径 4->0 代表数字 40

因此,数字总和 = 495 + 491 + 40 = 1026


思路:

    这道题的要求挺有意思的,要将从根节点到叶子节点的数字们连起来加成一个新的数。二叉树的题目,我们基本就是用递归来解决。

    递归思路很明确:从上到下,每一个节点继承上面来的数字和,再拼接自己的值来得到当前节点的值,再传给下一个节点。下一个节点也重复这一操作。而这种每一个节点都做同样操作的任务,自然是得通过递归来实现。

    我们定义递归函数di(root,state),里面两个参数分别是当前节点以及它获得的来自上一个节点的结果。因为python中可以很方便地将数字转为字符串拼接,所以我们不需要通过“乘以10再加”的操作,直接转成str来拼接即可。

    当我们递归到叶子节点时,我们先将这个叶子节点的结果暂存起来,最终我们按题意把所有叶子节点的结果相加即可。

代码:

class Solution:

    def sumNumbers(self, root: TreeNode) -> int:

        res=[]#存放叶子节点结果的列表

        def di(root,state):
            
            #如果它是叶子节点
            if not root.left and not root.right:

                res.append(state)#此时state已经全部拼接好了,送入res

            if root.left:#如果这个节点有左子树

                di(root.left,state+str(root.left.val))#向左子树递归,把左节点val值拼进state

            if root.right:#如果有右子树 同理

                di(root.right,state+str(root.right.val))

        #开始递归
        di(root,str(root.val))

        res = sum(list(map(int,res)))#此时res里都是字符串,要处理一下

        return res

  在代码细节上,我们在res中存放的是字符串,并不是数字,所以不能直接sum,可以通过list(map(int,列表))的方式将列表中的字符串全部转换成数字类型。这是个常用小技巧。(当然可以在放入res的时候直接将元素转变成数字,就不用这么多此一举了。)

  这道题题意清晰,目的明确,理解和实现起来也不复杂,能够很好地体现递归思路的巧妙呀~

posted @   JunanP  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示