返回
LeetCode 算法学习篇:深入剖析二叉树的最大深度
前端
2023-12-31 22:58:42
哈喽,小伙伴们!今天我们继续 LeetCode 算法学习之旅,这一次我们聚焦的题目是「104. 二叉树的最大深度」。
题目分析
二叉树是一种重要的数据结构,在计算机科学中有着广泛的应用。二叉树的最大深度是指从根节点到最深叶子节点的最长路径的长度。
举个例子,考虑以下二叉树:
1
/ \
2 3
/ \ / \
4 5 6 7
这棵二叉树的最大深度是 4,因为从根节点 1 到叶子节点 7 的路径最长。
解法一:递归
递归是一种强大的编程技巧,它允许函数调用自身。在解决「二叉树的最大深度」问题时,递归是一个非常自然的选择。
我们可以定义一个递归函数 maxDepth
,它接受一个二叉树节点作为参数,并返回该节点子树的最大深度。
def maxDepth(root):
if not root:
return 0
left_depth = maxDepth(root.left)
right_depth = maxDepth(root.right)
return max(left_depth, right_depth) + 1
在这个函数中,我们首先检查根节点是否为空。如果是,则返回 0,因为空树的最大深度为 0。
否则,我们递归地计算左右子树的最大深度,然后返回这两个深度的最大值加 1。
解法二:迭代
除了递归之外,我们还可以使用迭代的方法来求解「二叉树的最大深度」。
我们可以使用栈来存储需要遍历的节点。首先,我们将根节点压入栈中。然后,只要栈不为空,我们就弹出栈顶元素,并将其左右子节点压入栈中。同时,我们将当前节点的最大深度与当前栈的最大深度进行比较,并更新栈的最大深度。
def maxDepth(root):
if not root:
return 0
stack = [root]
max_depth = 0
while stack:
node = stack.pop()
max_depth = max(max_depth, node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return max_depth
总结
递归和迭代是解决「二叉树的最大深度」问题的两种常见方法。递归是一种简单而优雅的方法,但它可能会导致栈溢出。迭代是一种更有效的方法,因为它不需要额外的空间来存储函数调用。
在时间复杂度方面,递归和迭代都具有相同的渐进时间复杂度 O(n),其中 n 是二叉树中的节点数。
希望这篇文章能帮助你更好地理解「二叉树的最大深度」算法。如果你有任何问题,欢迎在评论区留言。