返回
LeetCode 111:二叉树的最小深度
见解分享
2024-02-14 15:37:37
题解:
方法一:后序遍历(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
# 这样就不用再写一个额