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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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