257. 二叉树的所有路径

145 阅读1分钟

image.png

DFS+回溯

class Solution {
    LinkedList<Integer> path = new LinkedList<>();
    List<String> list = new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
        dfs(root);
        return list;
    }
    public void dfs(TreeNode node) {
        if (node == null) {
            return;
        }
        path.add(node.val);
        if (node.left == null && node.right == null) {
            int size = path.size();
            String res = "";
            for (int i = 0; i < size; i++) {
                if (i != size - 1) {
                    res = res + path.get(i) + "->";//Integer直接转成char了
                } else {
                    res += path.get(i);
                }
            }
            list.add(res);
        }
        dfs(node.left);//因为是void类型,node.left遇到null后return,继续执行下面的语句
        // path.removeLast(); //不可撤销,下层null直接return,删掉的是当前节点
        dfs(node.right);
        path.removeLast();//当一个节点的左右节点均访问过才可以撤销
    }
}

写法2

class Solution {
    List<Integer> path = new ArrayList<>();
    List<String> res = new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
        dfs(root);
        return res;
    }
    public void dfs(TreeNode node) {
        path.add(node.val);
        if (node.left == null && node.right == null) {
            String str = "";
            for (int i = 0; i < path.size(); i++) {
                if (i != path.size() - 1) {
                    str += path.get(i) + "->";
                } else {
                    str += path.get(i);
                }
            }
            res.add(str);
            return;
        }
        if (node.left != null) {
            dfs(node.left);
            path.remove(path.size() - 1);// 下层的null不会被添加访问
        }
        if (node.right != null) {
            dfs(node.right);
            path.remove(path.size() - 1);
        }
    }
}