@@ -283,6 +283,7 @@ public:
283
283
Java:
284
284
285
285
``` Java
286
+ // 解法一
286
287
class Solution {
287
288
/**
288
289
* 递归法
@@ -321,6 +322,52 @@ class Solution {
321
322
}
322
323
}
323
324
325
+ // 解法二(常规前序遍历,不用回溯),更容易理解
326
+ class Solution {
327
+ public List<String > binaryTreePaths (TreeNode root ) {
328
+ List<String > res= new ArrayList<> ();
329
+ helper(root,new StringBuilder (), res);
330
+ return res;
331
+ }
332
+
333
+ public void helper (TreeNode root ,StringBuilder sb ,List<String > res ) {
334
+ if (root== null ) {return ;}
335
+ // 遇到叶子结点就放入当前路径到res集合中
336
+ if (root. left== null && root. right== null ) {
337
+ sb. append(root. val);
338
+ res. add(sb. toString());
339
+ // 记得结束当前方法
340
+ return ;
341
+ }
342
+ helper(root. left,new StringBuilder (sb). append(root. val+ " ->" ),res);
343
+ helper(root. right,new StringBuilder (sb). append(root. val+ " ->" ),res);
344
+ }
345
+ }
346
+
347
+ // 针对解法二优化,思路本质是一样的
348
+ class Solution {
349
+ public List<String > binaryTreePaths (TreeNode root ) {
350
+ List<String > res= new ArrayList<> ();
351
+ helper(root," " , res);
352
+ return res;
353
+ }
354
+
355
+ public void helper (TreeNode root ,String path ,List<String > res ) {
356
+ if (root== null ) {return ;}
357
+ // 由原始解法二可以知道,root的值肯定会下面某一个条件加入到path中,那么干脆直接在这一步加入即可
358
+ StringBuilder sb= new StringBuilder (path);
359
+ sb. append(root. val);
360
+ if (root. left== null && root. right== null ) {
361
+ res. add(sb. toString());
362
+ }else {
363
+ // 如果是非叶子结点则还需要跟上一个 “->”
364
+ sb. append(" ->" );
365
+ helper(root. left,sb. toString(),res);
366
+ helper(root. right,sb. toString(),res);
367
+ }
368
+ }
369
+ }
370
+
324
371
```
325
372
326
373
Python:
@@ -350,7 +397,7 @@ class Solution:
350
397
351
398
```
352
399
Go:
353
-
400
+
354
401
``` go
355
402
func binaryTreePaths (root *TreeNode ) []string {
356
403
res := make ([]string ,0 )