# 1022.从根到叶的二进制之和
给出一棵二叉树,其上每个结点的值都是 0
或 1
。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1
,那么它表示二进制数 01101
,也就是 13
。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32
位 整数。
# 解答
/**
* 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) {
if(root===null) return 0;
let result = 0
let pathArray = []
let dfs = function(node) {
if(node === null) return
pathArray.push(node.val)
if(node.left === null&&node.right===null) {
//叶子节点
result += Number.parseInt(pathArray.join(''),2)
} else {
if(node.left) {
dfs(node.left)
}
if(node.right) {
dfs(node.right)
}
}
pathArray.pop()
}
dfs(root)
return result
};
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
28
29
30
31
32
33
34
35
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
28
29
30
31
32
33
34
35
# 129.求根到叶子节点数字之和
// bfs
var sumNumbers = function (root) {
if (!root) return 0;
const nodes = [[root, root.val]];
const res = [];
while (nodes.length) {
const [node, number] = nodes.shift();
if (!node.left && !node.right) {
res.push(number);
}
if (node.left) nodes.push([node.left, `${number}${node.left.val}`]);
if (node.right) nodes.push([node.right, `${number}${node.right.val}`]);
}
return res.reduce((acc, cur) => acc + (+cur), 0);
}
// dfs
var sumNumbers = function (root) {
const res = [];
helper(root, '', res);
return res.reduce((acc, cur) => acc + (+cur), 0);
};
function helper(root, cur, res) {
if (!root) return;
cur += root.val;
if (!root.left && !root.right) {
res.push(cur);
return;
}
helper(root.left, cur, res);
helper(root.right, cur, res);
}
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
28
29
30
31
32
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
28
29
30
31
32