二叉树的所有路径

48 阅读1分钟

力扣题目链接

该解法使用了前序递归遍历二叉数-中左右

1.确定递归函数的参数和返回值

参数:首先要传入TreeNode,其次要传入结果集用于保存结果,最后要传入pathList用于对每一个路径进行处理和保存

返回值: 因为把结果直接放在了resultList中,所以不需要任何返回值

2.确定递归终止条件

当node的左右结点都是null时就没有必要继续递归了

3.确定单层递归的逻辑

查看以下具体代码中的注释

public List<String> binaryTreePaths(TreeNode root) {
    List<String> result = new ArrayList<>();
    ArrayList<Integer> integers = new ArrayList<>();
    getPaths(root, result, integers);
    return result;
}

public void getPaths(TreeNode node, List<String> result, List<Integer> path) {
    //需要把加入数据放在终止条件前面,不然叶子结点的值还没有被加入就先返回了
    path.add(node.val);
    //确定终止条件
    if (node.left == null && node.right == null) {
        // 输出
        StringBuilder sb = new StringBuilder();// StringBuilder用来拼接字符串,速度更快,但是线程不安全
        for (int i = 0; i < path.size() - 1; i++) {
            sb.append(path.get(i)).append("->");
        }
        sb.append(path.get(path.size() - 1));
        result.add(sb.toString());
        return;
    }
    //按照前序递归进行遍历-中左右
    if (node.left != null) {
        getPaths(node.left, result, path);
        //回溯时,移除path中的最后一个元素
        path.remove(path.size() - 1);
    }
    if (node.right != null) {
        getPaths(node.right, result, path);
        //回溯时,移除path中的最后一个元素
        path.remove(path.size() - 1);
    }
}