Skip to content

Commit 47cdaa2

Browse files
committed
129.求根节点到叶节点数字之和
1 parent 69033da commit 47cdaa2

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

leetcode_Java/Solution0129.java

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@
1919

2020

2121
/*
22-
递归,自顶向下计算:
23-
1、方法功能:入参是节点、前面的数字之和,返回根节点到达当前节点时的数字之和
24-
2、终止条件:节点为空时返回0
25-
3、递归逻辑:根节点到达当前节点时的数字之和 = 前面的数字之和 * 10 + 当前节点值,返回该结果。由于左右节点同样需要计算数字之和,因此调用同样的方法
26-
4、返回结果:节点的左右节点都为空时,返回该节点的数字之和。否则计算左右节点的数字之和,两者相加然后返回。
22+
递归,深度优先搜索:
23+
1、递归思路:自顶向下计算每个节点“产生的数字”,直到叶子结点才是最终有效的目标数字,再将叶子结点的有效数字 自底向上累加得到所有路径的数字之和
24+
2、方法功能:入参是当前节点、父节点“产生的数字”,返回当前节点的数字之和(经过当前节点的路径的数字之和)
25+
3、终止条件:节点为空时返回0
26+
4、递归逻辑:
27+
1)计算根节点到达当前节点时“产生的数字” = 父节点“产生的数字” * 10 + 当前节点值
28+
2)如果当前节点没有子节点,那么当前节点的数字之和 就是“产生的数字”,直接返回该结果
29+
2)如果当前节点有子节点,那么当前节点的数字之和 就是左右节点“产生的数字”的和。左右节点同样需要计算“产生的数字”,因此调用同样的方法,接收到返回值后相加
2730
*/
2831
class Solution {
2932
public int sumNumbers(TreeNode root) {
@@ -40,5 +43,43 @@ private int dfs(TreeNode root, int preSum) {
4043
}
4144
return dfs(root.left, sum) + dfs(root.right, sum);
4245
}
46+
}
4347

48+
49+
/*
50+
广度优先搜索:
51+
1、使用两个队列,一个存放节点,一个存放根节点到达该节点时“产生的数字”,两个队列一一对应
52+
2、层序遍历,遍历当前层时,把下一层的节点和“产生的数字”存入队列
53+
3、到达叶子结点时才将最终“产生的数字”累加到总和中,即将最后一层节点“产生的数字”累加就是根节点到叶节点数字之和
54+
4、否则持续计算到达新节点时“产生的数字”,并将节点与“产生的数字”保存在队列中
55+
*/
56+
class Solution {
57+
public int sumNumbers(TreeNode root) {
58+
if (root == null) {
59+
return 0;
60+
}
61+
Queue<TreeNode> nodeQueue = new LinkedList<>();
62+
Queue<Integer> valQueue = new LinkedList<>();
63+
nodeQueue.offer(root);
64+
valQueue.offer(root.val);
65+
int sum = 0;
66+
while (!nodeQueue.isEmpty()) {
67+
TreeNode node = nodeQueue.poll();
68+
int val = valQueue.poll();
69+
TreeNode left = node.left, right = node.right;
70+
if (left == null && right == null) {
71+
sum += val;
72+
} else {
73+
if (left != null) {
74+
nodeQueue.offer(left);
75+
valQueue.offer(val * 10 + left.val);
76+
}
77+
if (right != null) {
78+
nodeQueue.offer(right);
79+
valQueue.offer(val * 10 + right.val);
80+
}
81+
}
82+
}
83+
return sum;
84+
}
4485
}

0 commit comments

Comments
 (0)