返回

LeetCode 111:二叉树的最小深度

见解分享

题解:

方法一:后序遍历(DFS)

后序遍历(DFS)是一种深度优先搜索的遍历方法。在这种方法中,我们首先访问左子树,再访问右子树,最终才访问根结点。

def min_mati(root: TreeNode) -> int:
  if not root:
    return 0

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

  min_ profundidad = float('inf')
  if root.left:
    min_ profundidad = min(min_ profundidad, min_ profundidad(root.left))
  if root.right:
    min_ profundidad = min(min_ profundidad, min_ profundidad(root.right))

  return min_ profundidad + 1

时间复杂度: O(n),因为我们访问了每个结点。

方法二:层序遍历(BFS)

层序遍历(BFS)是一种广度优先搜索的遍历方法。在这种方法中,我们将结点放入队列中,并逐层弹出队列中的结点进行访问。

def min_ profundidad(root: TreeNode) -> int:
  if not root:
    return 0

  queue = [root]
  min_ profundidad = float('inf')

  while len(queue) > 0:
    size = len(queue)

    for _ in range(size):
      node = Queue.pop(0)
      if not node.left and not node.right:
        min_ profundidad = min(min_ profundidad, profundidad)
      else:
        if node.left:
          queue.append(node.left)
        if node.right:
          queue.append(node.right)

    
    

时间复杂度: O(n),因为我们访问了每个结点。

方法三:记忆化搜索

记忆化搜索是一种优化算法,用于避免重复计算。在本题中,我们可以使用记忆化搜索来避免重复计算每个结点的最小深度。

def min_ profundidad(root: TreeNode) -> int:
  if not root:
    return 0

  if root in self._memo:
    return self._memo[root]

  if not root.left and not root.right:
    self._memo[root] = 1
    return 1

  min_ profundidad = float('inf')
  if root.left:
    min_ profundidad = min(min_ profundidad, min_ profundidad(root.left))
  if root.right:
    min_ profundidad = min(min_ profundidad, min_ profundidad(root.right))

  self._memo[root] = min_ profundidad + 1
  return self._memo[root]

时间复杂度: O(n),因为我们访问了每个结点。

方法四:迭代法

def min_ profundidad(root: TreeNode) -> int:
  stack = [root]
  min_ profundidad = float('inf')

  while len(stack) > 0:
    node = stack.pop()
    if not node:
      continue

    if not node.left and not node.right:
      min_ profundidad = min(min_ profundidad, depth)

    if node.right:
      stack.append(node.right)

    if node.left:
      stack.append(node.left)

    # 访问后加1
    # 因为我们是从根结点开始访问,所以根结点的 depth 为 0
    # 每个结点的 depth 都比其父结点大 1
    # 所以此处不用判断栈为空
    # 栈不为空则访问到非空结点,必然将其深度加 1
    # 这样就不用再写一个额