链接: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.
思路:
从题意可知,二叉树的根节点到叶子节点的路径代表一个数字,我们需要求出所有路径的和。其实,这题非常简单,每个节点对应一个数字,等于其父节点对应的数字乘以 10 再加上该节点的值。
时间复杂度:O(n)
空姐复杂度:O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sumNumbers(self, root: TreeNode) -> int:
if not root:
return 0
return self.dfs(root,0)
def dfs(self,root,ans):
if not root:
return 0
ans=10*ans+root.val
if not root.left and not root.right:
return ans
return self.dfs(root.left,ans)+self.dfs(root.right,ans)
其实,我们也可以求出二叉树的所有路径,最后将这些路径转换为 int 型后相加,但是其实这道题不适合,复杂度也不好。因为我们已经可以一边遍历一边计算结果,已经没有必要再去转换一下,不过也可以把这种方法写一下。
# 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:
res=[]
def helper(root,tmp=''):
if not root:
return
if not root.left and not root.right:
tmp+=str(root.val)
res.append(tmp)
helper(root.left,tmp+str(root.val))
helper(root.right,tmp+str(root.val))
helper(root)
ans=0
for i in res:
ans+=int(i)
return ans
时间复杂度:O(n)
空姐复杂度:O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sumNumbers(self, root: TreeNode) -> int:
if not root:
return 0
ans=0
queue=[(root,root.val)]
while queue:
node,val=queue.pop(0)
left,right=node.left,node.right
if not left and not right:
ans+=val
else:
if left:
queue.append((left,val*10+left.val))
if right:
queue.append((right,val*10+right.val))
return ans
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。