求根节点到叶节点数字之和
给你一个二叉树的根节点 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的时候直接将元素转变成数字,就不用这么多此一举了。)
这道题题意清晰,目的明确,理解和实现起来也不复杂,能够很好地体现递归思路的巧妙呀~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了