257. Binary Tree Paths

解法一 Recursive (String or StringBuilder)

思路

使用 preorder traversal, 我们可以通过 String 的叠加或者 StringBuilder 的 append(), 对路径进行遍历。
我们需要定义一个 ArrayList 返回所有路径;使用 StringBuilder 使需要新建 SB 对象。
定义一个遍历树的方法 searchTree:
如果这个节点本身为 null, 那么就退出遍历;如果某个节点左右子都为 null, 就将所记录的字符串添加进 ArrayList 中;否则,对这个节点的左右子树进行 searchTree() 的递归调用。

代码
// 使用 String 叠加
Class Solution () {
    public List<String> binaryTreePaths(TreeNode root) {
        ArrayList<String> paths = new ArrayList<>();
        searchTree(root, "", paths);
        return paths;
    }
    public void searchTree (TreeNode root, String str, ArrayList<String> paths) {
        if (root == null) {
            return;
        }
        // 至少说明 root 在路径中因为非 null
        if (root.left == null && root.right == null) {
            paths.add(str + root.val);
        }
        // 其他情况,说明 root 在路径中, str 要添加 root.val,再搜索左右子树是否有路径
        searchTree(root.left, str + root.val + "->", paths);
        searchTree(root.right, str + root.val + "->", paths);
    }
}

// 使用 StringBuilder
Class Solution () {
    public List<String> binaryTreePaths(TreeNode root) {
        ArrayList<String> paths = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        searchTree(root, sb, paths);
        return paths;
    }
    public void searchTree (TreeNode root, StringBuilder sb, ArrayList<String> paths) {
        if (root == null) {
            return;
        }
        // 至少说明 root 在路径中因为非 null
        int len = sb.length();
        sb.append(root.val);
        if (root.left == null && root.right == null) {
            paths.add(sb.toString());
        }
        // 其他情况,说明 root 在路径中
        sb.append("->");
        searchTree(root.left, sb, paths);
        searchTree(root.right, sb, paths);
        sb.setLength(len); // back track to before root
    }
}
复杂度分析
  • 时间复杂度
    • 最好情况
    • 最坏情况
    • 平均情况
  • 空间复杂度

解法二 Iteration

思路
代码
复杂度分析
  • 时间复杂度
    • 最好情况
    • 最坏情况
    • 平均情况
  • 空间复杂度

Takeaway

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!