60
60
61
61
<!-- 这里可写通用的实现逻辑 -->
62
62
63
- DFS。
63
+ ** 方法一:DFS**
64
+
65
+ 我们可以设计一个函数 $dfs(root, s)$,表示从当前节点 $root$ 出发,且当前路径数字为 $s$,返回从当前节点到叶子节点的所有路径数字之和。那么答案就是 $dfs(root, 0)$。
66
+
67
+ 函数 $dfs(root, s)$ 的计算如下:
68
+
69
+ - 如果当前节点 $root$ 为空,则返回 $0$。
70
+ - 否则,将当前节点的值加到 $s$ 中,即 $s = s \times 10 + root.val$。
71
+ - 如果当前节点是叶子节点,则返回 $s$。
72
+ - 否则,返回 $dfs(root.left, s) + dfs(root.right, s)$。
73
+
74
+ 时间复杂度 $O(n)$,空间复杂度 $O(\log n)$。其中 $n$ 是二叉树的节点数。
64
75
65
76
<!-- tabs:start -->
66
77
76
87
# self.left = left
77
88
# self.right = right
78
89
class Solution :
79
- def sumNumbers (self , root : TreeNode) -> int :
80
- def dfs (root , presum ):
90
+ def sumNumbers (self , root : Optional[ TreeNode] ) -> int :
91
+ def dfs (root , s ):
81
92
if root is None :
82
93
return 0
83
- s = 10 * presum + root.val
94
+ s = s * 10 + root.val
84
95
if root.left is None and root.right is None :
85
96
return s
86
97
return dfs(root.left, s) + dfs(root.right, s)
@@ -113,11 +124,11 @@ class Solution {
113
124
return dfs(root, 0 );
114
125
}
115
126
116
- private int dfs (TreeNode root , int presum ) {
127
+ private int dfs (TreeNode root , int s ) {
117
128
if (root == null ) {
118
129
return 0 ;
119
130
}
120
- int s = presum * 10 + root. val;
131
+ s = s * 10 + root. val;
121
132
if (root. left == null && root. right == null ) {
122
133
return s;
123
134
}
@@ -143,15 +154,14 @@ class Solution {
143
154
class Solution {
144
155
public:
145
156
int sumNumbers(TreeNode* root) {
157
+ function<int(TreeNode* , int)> dfs = [ &] (TreeNode* root, int s) -> int {
158
+ if (!root) return 0;
159
+ s = s * 10 + root->val;
160
+ if (!root->left && !root->right) return s;
161
+ return dfs(root->left, s) + dfs(root->right, s);
162
+ };
146
163
return dfs(root, 0);
147
164
}
148
-
149
- int dfs(TreeNode* root, int presum) {
150
- if (!root) return 0;
151
- int s = presum * 10 + root->val;
152
- if (!root->left && !root->right) return s;
153
- return dfs(root->left, s) + dfs(root->right, s);
154
- }
155
165
};
156
166
```
157
167
@@ -167,18 +177,18 @@ public:
167
177
* }
168
178
*/
169
179
func sumNumbers(root *TreeNode) int {
170
- var dfs func (root *TreeNode, presum int ) int
171
- dfs = func (root *TreeNode, presum int ) int {
172
- if root == nil {
173
- return 0
174
- }
175
- presum = presum * 10 + root.Val
176
- if root.Left == nil && root.Right == nil {
177
- return presum
178
- }
179
- return dfs (root.Left , presum ) + dfs (root.Right , presum )
180
- }
181
- return dfs (root, 0 )
180
+ var dfs func(*TreeNode, int) int
181
+ dfs = func(root *TreeNode, s int) int {
182
+ if root == nil {
183
+ return 0
184
+ }
185
+ s = s* 10 + root.Val
186
+ if root.Left == nil && root.Right == nil {
187
+ return s
188
+ }
189
+ return dfs(root.Left, s ) + dfs(root.Right, s )
190
+ }
191
+ return dfs(root, 0)
182
192
}
183
193
```
184
194
@@ -228,14 +238,13 @@ int sumNumbers(struct TreeNode *root) {
228
238
*/
229
239
230
240
function sumNumbers(root: TreeNode | null): number {
231
- return dfs(root);
232
- }
233
-
234
- function dfs(root: TreeNode | null, preSum: number = 0): number {
235
- if (!root) return 0;
236
- preSum = preSum * 10 + root.val;
237
- if (!root.left && !root.right) return preSum;
238
- return dfs(root.left, preSum) + dfs(root.right, preSum);
241
+ function dfs(root: TreeNode | null, s: number): number {
242
+ if (!root) return 0;
243
+ s = s * 10 + root.val;
244
+ if (!root.left && !root.right) return s;
245
+ return dfs(root.left, s) + dfs(root.right, s);
246
+ }
247
+ return dfs(root, 0);
239
248
}
240
249
```
241
250
@@ -281,6 +290,32 @@ impl Solution {
281
290
}
282
291
```
283
292
293
+ ### ** JavaScript**
294
+
295
+ ``` js
296
+ /**
297
+ * Definition for a binary tree node.
298
+ * function TreeNode(val, left, right) {
299
+ * this.val = (val===undefined ? 0 : val)
300
+ * this.left = (left===undefined ? null : left)
301
+ * this.right = (right===undefined ? null : right)
302
+ * }
303
+ */
304
+ /**
305
+ * @param {TreeNode} root
306
+ * @return {number}
307
+ */
308
+ var sumNumbers = function (root ) {
309
+ function dfs (root , s ) {
310
+ if (! root) return 0 ;
311
+ s = s * 10 + root .val ;
312
+ if (! root .left && ! root .right ) return s;
313
+ return dfs (root .left , s) + dfs (root .right , s);
314
+ }
315
+ return dfs (root, 0 );
316
+ };
317
+ ```
318
+
284
319
### ** ...**
285
320
286
321
```
0 commit comments