目录
1. 问题描述
给出一棵二叉树,其上每个结点的值都是 0
或 1
。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
- 例如,如果路径为
0 -> 1 -> 1 -> 0 -> 1
,那么它表示二进制数01101
,也就是13
。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位 整数。
示例 1:
输入:root = [1,0,1,0,1,0,1] 输出:22 解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
示例 2:
输入:root = [0] 输出:0
提示:
- 树中的节点数在
[1, 1000]
范围内 Node.val
仅为0
或1
2. 思路与算法
标准的深度优先路径遍历问题。
由于是路径便利,所以在深度优先搜索中要带着路径信息进行搜索。在本题中,不必携带真正的路径信息,只需要记录到当前节点之前的节点构成的二进制序列所表示的十进制值即可。
深度优先搜索函数不必返回值。总的累加值用非本地变量管理,每次找到一个叶子节点时,将到该叶子节点的路径所代表的值加到总的累加值上去即可。
3. 代码实现
# 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 sumRootToLeaf(self, root: Optional[TreeNode]) -> int:
ans = 0
def dfs(number,node):
# The number before the current node
nonlocal ans
if node.left == None and node.right == None:
# one leaf found
# print(ans,number)
ans = ans + 2*number + node.val
else:
if node.left != None:
dfs(2*number+node.val, node.left)
if node.right != None:
dfs(2*number+node.val, node.right)
dfs(0,root)
return ans
执行用时:32 ms, 在所有 Python3 提交中击败了99.03%的用户
内存消耗:15.5 MB, 在所有 Python3 提交中击败了5.16%的用户
一不小心竟然整了个99%,有点措不及防。
回到总目录:Leetcode每日一题总目录(动态更新。。。)