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

public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList();if (root == null) return res;dfs(root, "", res);return res;}public void dfs(TreeNode root, String path, List<String> res) {// 如果到达叶子节点,就把结果存放到集合res中if (root.left == null && root.right == null) {res.add(path + root.val);return;}// 如果左子节点不为空,就沿着左子节点走下去if (root.left != null) {dfs(root.left, path + root.val + "->", res);}// 如果右子节点不为空,就沿着右子节点走下去if (root.right != null) {dfs(root.right, path + root.val + "->", res);}}
我们来思考这样一个问题,如果知道了左子树和右子树的所有路径,我们在用根节点和 他们连在一起,是不是就是从根节点到所有叶子节点的所有路径,所以这里最容易想到 的就是递归
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 + "");// 遍历左子节点的所有路径if (root.left != null) {for (String path : binaryTreePaths(root.left)) {res.add(root.val + "->" + path);}}// 遍历右子节点的所有路径if (root.right != null) {for (String path : binaryTreePaths(root.right)) {res.add(root.val + "->" + path);}}return res;}
