129. Sum Root to Leaf Numbers

DFS

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
class Solution {
public int sumNumbers(TreeNode root) {
List<List<Integer>> resultList = new ArrayList<>();
List<Integer> pathNumList = new ArrayList<>();
dfs(resultList, pathNumList, root);

int sum = 0;
for (List<Integer> numList : resultList) {
int num = 0;
for (int n : numList) {
num = num * 10 + n;
}
sum += num;
}
return sum;
}

private void dfs(List<List<Integer>> resultList, List<Integer> pathNumList, TreeNode root) {
pathNumList.add(root.val);
if (root.left == null && root.right == null) {
// root 为叶子节点,收集
resultList.add(new ArrayList<>(pathNumList));
}

if (root.left != null) {
dfs(resultList, pathNumList, root.left);
}
if (root.right != null) {
dfs(resultList, pathNumList, root.right);
}
pathNumList.remove(pathNumList.size() - 1);
}
}

DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int sumNumbers(TreeNode root) {
return dfs(root, 0);
}

private int dfs(TreeNode root, int preSum) {
if (root == null) {
return 0;
}

preSum = preSum * 10 + root.val;
if (root.left == null && root.right == null) {
return preSum;
} else {
return dfs(root.left, preSum) + dfs(root.right, preSum);
}
}
}

BFS

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
class Solution {
public int sumNumbers(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);

int sum = 0;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.left == null && node.right == null) {
sum += node.val;
continue;
}

if (node.left != null) {
node.left.val = node.val * 10 + node.left.val;
queue.offer(node.left);
}
if (node.right != null) {
node.right.val = node.val * 10 + node.right.val;
queue.offer(node.right);
}
}

return sum;
}
}

References

129. Sum Root to Leaf Numbers
剑指 Offer II 049. 从根节点到叶节点的路径数字之和