1022. 从根到叶的二进制数之和【简单】
1. 📝 题目描述
给出一棵二叉树,其上每个结点的值都是 0 或 1。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
- 例如,如果路径为
0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数01101,也就是13。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位整数。
示例 1:

txt
输入:root = [1,0,1,0,1,0,1]
输出:22
解释:
(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 221
2
3
4
5
2
3
4
5
示例 2:
txt
输入:root = [0]
输出:01
2
2
提示:
- 树中的节点数在
[1, 1000]范围内 Node.val仅为0或1
2. 🎯 s.1 - DFS
js
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var sumRootToLeaf = function (root) {
let total = 0
const dfs = (node, acc) => {
if (!node) return
const cur = (acc << 1) + node.val
if (!node.left && !node.right) {
total += cur
return
}
dfs(node.left, cur)
dfs(node.right, cur)
}
dfs(root, 0)
return total
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- 时间复杂度:
,其中 n 是二叉树的节点数,每个节点访问一次 - 空间复杂度:
,其中 h 是树的高度,递归调用栈的最大深度
算法思路:
- 使用深度优先搜索(DFS)遍历从根到叶的所有路径
- 遍历过程中维护当前路径的二进制值:
cur = (acc << 1) + node.valacc << 1等价于acc * 2,相当于二进制左移一位- 加上当前节点值
node.val(0 或 1)
- 当到达叶子节点(无左右子节点)时,将当前路径值累加到总和
- 递归遍历左右子树,最终返回所有路径值的总和