这题让求的是从根节点到叶子节点的所有路径,最常见的一种方式就是DFS(深度优先 搜 索 ) , 也 就 是 从 根 节 点 沿 着 最 左 边 节 点 一 直 走 下 去 ( 如 果 没 有 左 子 节 点 , 有 右 子 节 点,会沿着右子节点走下去),当到达叶子节点的时候在返回到父节点,然后沿着父节 点的右子节点开始走下去,如下图所示
    image.png
    image.png

    1. public List<String> binaryTreePaths(TreeNode root) {
    2. List<String> res = new ArrayList();
    3. if (root == null) return res;
    4. dfs(root, "", res);
    5. return res;
    6. }
    7. public void dfs(TreeNode root, String path, List<String> res) {
    8. // 如果到达叶子节点,就把结果存放到集合res中
    9. if (root.left == null && root.right == null) {
    10. res.add(path + root.val);
    11. return;
    12. }
    13. // 如果左子节点不为空,就沿着左子节点走下去
    14. if (root.left != null) {
    15. dfs(root.left, path + root.val + "->", res);
    16. }
    17. // 如果右子节点不为空,就沿着右子节点走下去
    18. if (root.right != null) {
    19. dfs(root.right, path + root.val + "->", res);
    20. }
    21. }

    我们来思考这样一个问题,如果知道了左子树和右子树的所有路径,我们在用根节点和 他们连在一起,是不是就是从根节点到所有叶子节点的所有路径,所以这里最容易想到 的就是递归

    1. public List<String> binaryTreePaths(TreeNode root) {
    2. List<String> res = new ArrayList();
    3. if (root == null) return res;
    4. // 到达叶子节点,把路径加入到集合中
    5. if (root.left == null && root.right == null) res.add(root.val + "");
    6. // 遍历左子节点的所有路径
    7. if (root.left != null) {
    8. for (String path : binaryTreePaths(root.left)) {
    9. res.add(root.val + "->" + path);
    10. }
    11. }
    12. // 遍历右子节点的所有路径
    13. if (root.right != null) {
    14. for (String path : binaryTreePaths(root.right)) {
    15. res.add(root.val + "->" + path);
    16. }
    17. }
    18. return res;
    19. }