Binary Tree Paths Leetcode
Given a binary tree, return all root-to-leaf paths.
For example, given the following binary tree:
1 / \ 2 3 \ 5
All root-to-leaf paths are:
["1->2->5", "1->3"]
这道题做了半天。。。一开始我的思路是,从下往上,每一条路径上加上root的value,然而写了半天没写出来。。。后来看了下top solution里面有一个人和我想法一样,但写的代码真的十分精巧,我当时是用helper function但是用了两个参数,它这里没有用helper function。不知道怎么想出来的= =
排名第一的top solution是从上往下的原则,每一次把当前的path传给递归的function,这样到叶子就截止了,funcition的返回值是void的。以后遇到问题可以从上往下,从下往上都想想,参数的个数也可以多加几个,不要局限于一种思路出不来。
从上往下:
public class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if (root != null) { paths(res, "", root); } return res; } public void paths(List<String> res, String path, TreeNode root) { if (root.left == null && root.right == null) { res.add(path + root.val); return; } if (root.left != null) { paths(res, path + root.val + "->", root.left); } if (root.right != null) { paths(res, path + root.val + "->" , root.right); } } }
从下往上:
public class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if (root == null) { return res; } if (root.left == null && root.right == null) { res.add(root.val + ""); return res; } for (String path : binaryTreePaths(root.left)) { res.add(root.val + "->" + path); } for (String path : binaryTreePaths(root.right)) { res.add(root.val + "->" + path); } return res; } }
这个方法是每次都新建一个list,然后对返回的所有list前面加上root的值,思路很简单,但这个实现之前没见过。。。
再次遇到也不知道能不能写出来。。。需要回顾。