返回

浅析二叉树的最小深度,用LeetCode轻松掌握

前端

二叉树的最小深度:揭开LeetCode 111的神秘面纱

探索二叉树

想象一棵枝繁叶茂的树木,它的树干就是根节点,而它的枝条就是子节点。二叉树是一种特殊类型的树形数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点。它广泛应用于计算机科学中,从文件系统到数据库,它都发挥着至关重要的作用。

LeetCode 111:二叉树的最小深度

作为算法学习的殿堂,LeetCode 111 向你提出了一个引人入胜的挑战:计算二叉树的最小深度。最小深度是指从根节点到最近叶节点的最短路径长度。掌握这个概念是踏入算法世界的关键一步。

破解最小深度的秘密

破解 LeetCode 111 的秘密,有两种备受推崇的算法:深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索:深入探索

DFS 就像一位探险家,沿着树木的枝条一路向下探索。它从根节点开始,如果遇到叶节点,就返回其深度。否则,它会继续探索左子树和右子树,并返回较小的深度。

def min_depth_dfs(root):
    if not root:
        return 0

    if not root.left and not root.right:
        return 1

    left_depth = min_depth_dfs(root.left)
    right_depth = min_depth_dfs(root.right)

    return 1 + min(left_depth, right_depth)

广度优先搜索:逐层展开

BFS 就像一位园丁,逐层修剪树木的枝条。它从根节点开始,访问该层的所有节点,然后继续探索下一层。这个过程不断重复,直到到达最近的叶节点。

def min_depth_bfs(root):
    if not root:
        return 0

    queue = [(root, 1)]

    while queue:
        node, depth = queue.pop(0)

        if not node.left and not node.right:
            return depth

        if node.left:
            queue.append((node.left, depth + 1))

        if node.right:
            queue.append((node.right, depth + 1))

时间复杂度:O(n) VS O(n)

DFS 和 BFS 的时间复杂度都为 O(n),其中 n 是二叉树的节点数。但是,当树非常不平衡时,DFS 可能会导致栈溢出。BFS 通过逐层探索,避免了这个风险。

常见问题解答

  • 如何处理空树?
    如果树为空,最小深度为 0。
  • 如何处理叶子节点?
    如果一个节点既没有左子树也没有右子树,它就是叶子节点,其深度为 1。
  • 深度优先搜索和广度优先搜索有什么区别?
    DFS 深入探索树的枝条,而 BFS 逐层探索树的结构。
  • LeetCode 111 的应用场景有哪些?
    二叉树的最小深度可以用于优化文件系统、数据库索引和网络路由。
  • 掌握最小深度有什么好处?
    理解最小深度可以提高算法技能,为解决更复杂的算法问题奠定基础。

结论

解开 LeetCode 111 的奥秘是算法学习之旅中的重要一步。掌握深度优先搜索和广度优先搜索算法,可以让你深入探索二叉树的世界。通过理解最小深度,你将解锁算法世界的新天地,为你的编程之旅增添无限可能性。