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的值,思路很简单,但这个实现之前没见过。。。

再次遇到也不知道能不能写出来。。。需要回顾。

posted @ 2017-01-29 12:14  璨璨要好好学习  阅读(106)  评论(0编辑  收藏  举报