返回

LeetCode 算法学习篇:深入剖析二叉树的最大深度

前端

哈喽,小伙伴们!今天我们继续 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 是二叉树中的节点数。

希望这篇文章能帮助你更好地理解「二叉树的最大深度」算法。如果你有任何问题,欢迎在评论区留言。